Python学习随笔(九)

Python学习随笔(九)

直接看 参考

多线程
线程:是cpu最小调度单位,一个程序中至少有一个或者多个线程
import threading
t = threading.Thread(target=函数名, name=线程名, args=函数的参数元组,kwargs=函数的参数字典) 创建并初始化线程
t.start() 启动线程
t.join() 阻塞函数,直到线程结束为止
t.getName() 返回线程名
t.setName() 设置线程名
t.setDaemon(False) 设置为后台线程,默认是False,默认主线程会等待所有子线程结束之后才会结束,主线程结束意味着程序退出;如果设置为True,主线程则不会等待子线程,主线程结束,子线程自动结束
t.isAlive() 返回线程是否活动的
t.enumerate() 返回一个包含正在运行的线程的list
t.activeCount() 返回正在运行的线程数量,与len(threading.enumerate())有相同的结果;

线程互斥锁Lock
import threading
mutex = threading.Lock() 创建互斥锁
mutex.acquire() 锁定资源
mutex.release() 释放资源
互斥锁Lock主要针对多个线程同时操作同一个数据,使用互斥锁可以保证数据正常修改或者访问。

线程事件Event
import threading
eEvent = threading.Event() 创建event事件
eEvent.set() 全局内置标志Flag,将标志Flag 设置为 True,通知在等待状态(wait)的线程恢复运行
eEvent.isSet() 获取标志Flag当前状态,返回True 或者 False
eEvent.wait() 一旦调用,线程将会处于阻塞状态,直到等待其他线程调用set()函数恢复运行
eEvent.clear() 将标志设置为False
事件event中有一个全局内置标志Flag,值为 True 或者False。使用wait()函数的线程会处于阻塞状态,此时Flag指为False,直到有其他线程调用set()函数让全局标志Flag置为True,其阻塞的线程立刻恢复运行,还可以用isSet()函数检查当前的Flag状态.
事件Event主要用于唤醒正在阻塞等待状态的线程。

线程定时器Timer
指定时间间隔后启动线程
import threading
timer = threading.Timer(interval, function, args=None, kwargs=None)
interval — 定时器间隔,间隔多少秒之后启动定时器任务(单位:秒);
function — 线程函数;
args — 线程参数,可以传递元组类型数据,默认为空(缺省参数);
kwargs — 线程参数,可以传递字典类型数据,默认为空(缺省参数);

线程信号量semaphore
semaphore信号量可以通过内置计数器来控制同时运行线程的数量,启动线程(消耗信号量)内置计数器会自动减一,线程结束(释放信号量)内置计数器会自动加一;内置计数器为零,启动线程会阻塞,直到有本线程结束或者其他线程结束为止;
semaphore = threading.Semaphore(n) 添加一个计数器,最大并发线程数量n(最多同时运行n个线程)
semaphore.acquire() 消耗信号量,内置计数器减一
semaphore.release() 释放信号量,内置计数器加一

线程障碍对象Barrier
barrier = threading.Barrier(parties, action=None, timeout=None)
parties — 线程计数器,记录线程数量,也称线程障碍数量;
action — 是一个可调用函数,当等待的线程到达了线程障碍数量parties,其中一个线程会首先调用action 对应函数,之后再执行线程自己内部的代码;
timeout — 默认的超时时间;

线程条件变量Condition
con = threading.Condition() 创建条件变量condition
con.acquire() 条件变量condition 线程上锁
con.wait() 线程挂起(阻塞状态)
con.notify(n) 唤醒正在等待(wait)的n个线程
con.notifyAll() — 如果wait状态线程比较多,notifyAll的作用就是通知所有线程
con.release() 条件变量condition 线程释放锁

线程队列
import queue
线程队列Queue — FIFO(先进先出队列),即哪个数据先存入,取数据的时候先取哪个数据
q = queue.Queue()
线程队列LifoQueue — LIFO(先进后出队列),即哪个数据最后存入的,取数据的时候先取
q=queue.LifoQueue()
线程队列PriorityQueue — PriorityQueue(优先级队列),即存入数据时候加入一个优先级,取数据的时候优先级最高的取出
q = queue.PriorityQueue()

线程池ThreadPoolExecutor
from concurrent.futures import ThreadPoolExecutor
executor = ThreadPoolExecutor(max_workers=n) 线程池中最多能同时运行的线程数目为n
task = executor.submit(func, args ) 使用非阻塞方式调用func,args为传递给func的参数列表
task.done() 判断该任务是否结束
task.cancel() 取消提交的任务,如果任务已经在线程池中运行了,则不能取消
task.result() 获取task的执行结果
as_completed(executor.submit(func, args )) 是一个生成器,一次取出所有任务的结果
executor.map((func, args) 保证任务的顺序性
wait(all_task , return_when=ALL_COMPLETED 接收3个参数,等待的任务序列、超时时间以及等待条件。等待条件return_when默认为ALL_COMPLETED,表明要等待所有的任务都结束。等待条件可以设置为FIRST_COMPLETED,表示第一个任务完成就停止等待。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值