Python笔记day40(并发)|守护线程、线程锁、信号量、事件、条件、定时器、队列、线程池
1,内容回顾
# 正确的学习方法# input# output# correct 纠正# 线程# 线程是进程中的执行单位# 线程是cpu执行的最小单位# 线城之间资源共享# 线程的开启和关闭以及切换的时间开销远远小于进程# 线程本身可以在同一时间使用多个cpu
# python 与 线程# Cpython解释器在解释代码过程中容易产生数据不安全的问题# GIL 全局解释器锁 锁的是线程
# threading
2,守护线程
import time
from threading import Thread
def func1():while True:print('*'*10)time.sleep(1)
def func2():print('in func2')time.sleep(5)t = Thread(target=func1,)
t.daemon = True
t.start()
t2 = Thread(target=func2,)
t2.start()
t2.join()
print('主线程')# 守护进程随着主进程代码的执行结束而结束
# 守护线程会在主线程结束之后等待其他子线程的结束才结束# 主进程在执行完自己的代码之后不会立即结束 而是等待子进程结束之后 回收子进程的资源
# import time
# from multiprocessing import Process
# def func():
# time.sleep(5)
#
# if __name__ == '__main__':
# Process(target=func).start()
3,线程锁
import time
from threading import Lock,Thread
# Lock 互斥锁
# def func(lock):
# global n
# lock.acquire()
# temp = n
# time.sleep(0.2)
# n = temp - 1
# lock.release()
#
# n = 10
# t_lst = []
# lock = Lock()
# for i in range(10):
# t = Thread(target=func,args=(lock,))
# t.start()
# t_lst.append(t)# for t in t_lst: t.join()
# print(n)# 科学家吃面# noodle_lock = Lock()
# fork_lock = Lock()
# def eat1(name):
# noodle_lock.acquire()
# print('%s拿到面条啦'%name)
# fork_lock.acquire()
# print('%s拿到叉子了'%name)
# print('%s吃面'%name)
# fork_lock.release()
# noodle_lock.release()
#
# def eat2(name):
# fork_lock.acquire()
# print('%s拿到叉子了'%name)
# time.sleep(1)
# noodle_lock.acquire()
# print('%s拿到面条啦'%name)
# print('%s吃面'%name)
# noodle_lock.release()
# fork_lock.release()
#
# Thread(target=eat1,args=('alex',)).start()
# Thread(target=eat2,args=('Egon',)).start()
# Thread(target=eat1,args=('bossjin',)).start()
# Thread(target=eat2,args=('nezha',)).start()from threading import RLock # 递归锁
fork_lock = noodle_lock = RLock() # 一个钥匙串上的两把钥匙
def eat1(name):noodle_lock.acquire() # 一把钥匙print('%s拿到面条啦'%name)fork_lock.acquire()print('%s拿到叉子了'%name)print('%s吃面'%name)fork_lock.release()noodle_lock.release()def eat2(name):fork_lock.acquire()print('%s拿到叉子了'%name)time.sleep(1)noodle_lock.acquire()print('%s拿到面条啦'%name)print('%s吃面'%name)noodle_lock.release()fork_lock.release()Thread(target=eat1,args=('alex',)).start()
Thread(target=eat2,args=('Egon',)).start()
Thread(target=eat1,args=('bossjin',)).start()
Thread(target=eat2,args=('nezha',)).start()
4,信号量
import time
from threading import Semaphore,Thread
def func(sem,a,b):sem.acquire()time.sleep(1)print(a+b)sem.release()sem = Semaphore(4)
for i in range(10):t = Thread(target=func,args=(sem,i,i+5))t.start()
5,事件
# 事件被创建的时候
# False状态# wait() 阻塞
# True状态# wait() 非阻塞
# clear 设置状态为False
# set 设置状态为True# 数据库 - 文件夹
# 文件夹里有好多excel表格# 1.能够更方便的对数据进行增删改查# 2.安全访问的机制# 起两个线程
# 第一个线程 : 连接数据库# 等待一个信号 告诉我我们之间的网络是通的# 连接数据库
# 第二个线程 : 检测与数据库之间的网络是否连通# time.sleep(0,2) 2# 将事件的状态设置为True
import time
import random
from threading import Thread,Event
def connect_db(e):count = 0while count < 3:e.wait(0.5) # 状态为False的时候,我只等待1s就结束if e.is_set() == True:print('连接数据库')breakelse:count += 1print('第%s次连接失败'%count)else:raise TimeoutError('数据库连接超时')def check_web(e):time.sleep(random.randint(0,3))e.set()e = Event()
t1 = Thread(target=connect_db,args=(e,))
t2 = Thread(target=check_web,args=(e,))
t1.start()
t2.start()
6,条件
# 条件
from threading import Condition# 条件
# 锁
# acquire release
# 一个条件被创建之初 默认有一个False状态
# False状态 会影响wait一直处于等待状态
# notify(int数据类型) 造钥匙
from threading import Thread,Condition
def func(con,i):con.acquire()con.wait() # 等钥匙print('在第%s个循环里'%i)con.release()
con = Condition()
for i in range(10):Thread(target=func,args = (con,i)).start()
while True:num = int(input('>>>'))con.acquire()con.notify(num) # 造钥匙con.release()
7,定时器
import time
from threading import Timer
def func():print('时间同步') #1-3while True:t = Timer(5,func).start() # 非阻塞的time.sleep(5)
8,队列
# queue
import queueq = queue.Queue() # 队列 先进先出
# q.put()
# q.get()
# q.put_nowait()
# q.get_nowait()# q = queue.LifoQueue() # 栈 先进后出
# q.put(1)
# q.put(2)
# q.put(3)
# print(q.get())
# print(q.get())q = queue.PriorityQueue() # 优先级队列
q.put((20,'a'))
q.put((10,'b'))
q.put((30,'c'))
q.put((-5,'d'))
q.put((1,'?'))
print(q.get())
9,线程池
import time
from concurrent.futures import ThreadPoolExecutor
def func(n):time.sleep(2)print(n)return n*ndef call_back(m):print('结果是 %s'%m.result())tpool = ThreadPoolExecutor(max_workers=5) # 默认 不要超过cpu个数*5
for i in range(20):tpool.submit(func,i).add_done_callback(call_back)# tpool.map(func,range(20)) # 拿不到返回值
# t_lst = []
# for i in range(20):
# t = tpool.submit(func,i)
# t_lst.append(t)
# tpool.shutdown() # close+join #
# print('主线程')
# for t in t_lst:print('***',t.result())# ftp
# 并发编程
Python笔记day40(并发)|守护线程、线程锁、信号量、事件、条件、定时器、队列、线程池相关推荐
- 线程的创建 锁 Threading模块 事件 条件 定时器 队列 线程池 回调函数
线程的创建: 创建线程的方式1: from threading import Thread import time def sayhi(name):time.sleep(2)print('%s say ...
- 进程同步控制(锁,信号量,事件), 进程通讯(队列和管道,生产者消费者模型) 数据共享(进程池和mutiprocess.Pool模块)...
参考博客 https://www.cnblogs.com/xiao987334176/p/9025072.html#autoid-1-1-0 进程同步(multiprocess.Lock.Semaph ...
- 网络编程9_线程-条件,定时器,队列,线程池, 协程
线程 一. 条件 使得线程等待,只有满足某条件时,才释放n个线程 import time from threading import Thread,RLock,Conditio ...
- python 全栈开发,Day39(进程同步控制(锁,信号量,事件),进程间通信(队列,生产者消费者模型))...
昨日内容回顾 python中启动子进程 并发编程 并发 :多段程序看起来是同时运行的 ftp 网盘 不支持并发 socketserver 多进程 并发 异步 两个进程 分别做不同的事情 创建新进程 j ...
- day034 锁,信号量,事件,队列,子进程与子进程通信,生产者消费者模型,joinableQueue...
进程锁 #加锁可以保证多个进程修改同一块数据时,同一时间只能有一个任务可以进行修改,即串行的修改,没错,速度是慢了,但牺牲了速度却保证了数据安全. 虽然可以用文件共享数据实现进程间通信,但问题是: 1 ...
- 进程锁、事件、进程队列、进程间共享数据、生产者消费者模型
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 进程锁(Lock) 锁的基本概念 锁的基本用法 模拟12306抢票软件 信号量:Semaphone 概念 Semaphore ...
- Python笔记_第四篇_高阶编程_进程、线程、协程_5.GPU加速
Numba:高性能计算的高生产率 在这篇文章中,笔者将向你介绍一个来自Anaconda的Python编译器Numba,它可以在CUDA-capable GPU或多核cpu上编译Python代码.Pyt ...
- C++多线程 互斥锁 信号量 事件 临界区
一.互斥锁 1.先熟悉熟悉API 1,创建互斥锁,并反正一个句柄 HANDLE CreateMutex( LPSECURITY_ATTRIBUTESlpMutexAttributes, // 指向安全 ...
- 【并发】线程同步——锁Lock与synchronized比较
一.简单使用Lock锁 Java 5中引入了新的锁机制--java.util.concurrent.locks中的显式的互斥锁:Lock接口,它提供了比synchronized更加广泛的锁定操作.Lo ...
最新文章
- 给自己提个醒:关于document.getElementsByName无法获取非表单元素
- LeetCode Single Number
- 更新pip到指定版本
- 为梦想而战,高考励志主题教育班会PPT
- 【实施工程师】Linux安装Windows软件:微信、QQ、TIM
- 通向财务自由之路06_适应大环境的交易策略
- 2018 蓝桥杯省赛 B 组模拟赛(一)I. 天上的星星(二维前缀和)
- HeadFirst设计模式之命令模式
- 修改strut默认的action后缀
- win10 如何做到 C盘 的绝对干净,所有软件都安装到D盘,C盘只用来存操作系统。
- 2016首次CCCC总结
- vidda系统+android系统,海信电视精简教程,去除电视多余应用,换桌面!
- 广义瑞利商_瑞利商定义和广义瑞利商
- 基于SSM的美容院管理系统
- 【python】Flask-SQLAlchemy的Lost connection问题
- github whs_从iPhone或iPod Touch获得WHS的基本访问权限,而无需安装应用程序
- 用谷歌还是火狐?手机端还是另外选择其他浏览器吧
- 电子警察位置【收藏】
- python 截取图片中的一部分并且复制到另一张图片中 (任意角度旋转)
- NLP | 深入浅出word2vec
热门文章
- Python切片练习
- nuiapp请求网络_uni-app 页面配置和跳转(一)
- 从0到1入门STM32最小系统板(2-1)——绘制原理图之器件选型
- 【愚公系列】2023年04月 wireshark系列-数据抓包分析之之恶意流量FTP
- 【机器学习】什么是过度拟合?如何解决过度拟合?
- SAP-QM检验结果记录-定量超过限定范围为什么还是评估为通过?
- 最多跑一次,数字化政府,和 CloudFoundry
- Jquery实现仿腾讯微薄的广播发表
- 创造一个“超长待机”的世界,我们离不开“锂”
- 谁说菜鸟不会数据分析python pdf_谁说菜鸟不会数据分析spss