1. 共享全局变量
多个线程之间可以通过共用一个全局变量(如列表)来通信, 一个线程负责往里面放任务,另一个线程负责消耗任务.
如果被共享的变量与运行的程序不在同一个文件中,从另一个文件中导入变量的时候一定要import 文件名, 之后通过文件名.变量的方式引用共享变量. 尽量不要直接from 文件名 import 变量名
当对共享变量进行操作时应该使用Lock将操作步骤acquire,执行完成以后将锁release, Lock只允许acquire一次,必须release以后才能继续acquire. 而Rlock允许在同一个线程之中多次acquire,但acquire的次数必须和release的次数相同
注: 由于线程间的安全问题,共享全局变量的方式进行线程通信必然会导致共享变量出错,此时就必须加锁导致代码更加繁琐,因此不建议使用该方式进行线程通信
2. 使用Queue进行线程通信
Queue本身就是线程安全的数据结构, 因此不用担心线程往里面存、取数据导致数据出错. 其底层是使用deque
使用方式为: 一个线程负责往Queue中存入任务,另一个线程负责消耗任务,此时两个线程之间的共享变量变为Queue.
Queue的部分方法介绍:
get(): 获取Queue中的一条数据,该方法是会阻塞的,如果Queue中没有数据那么会一直停在这里
put(): 往Queue中存入一条数据,如果Queue已满,那么会阻塞
qsize(): 获取Queue的长度
empty(): 判断Queue是否为空
full(): 判断Queue是否已满
put_nowait(): 与put方法相同,只是不阻塞,会立刻返回结果.可以设置put方法的block参数实现
get_nowait(): 与get方法相同,只是不阻塞,会立刻返回结果.可以设置get方法的block参数实现
join和task_done方法: join方法可以从Queue的角度阻塞整个程序的运行,直到Queue收到一个task_done方法的信号才会退出程序. task_done放法要写在join方法之前.
网友评论