对于线程, 只需要全局变量即可通信, 而对于进程, 则需要使用内存通信
a进程把数据存储在内存中, 然后b进程从内存获取, 这里通过”队列”存取数据
进程通信演示
这里使用ipython进行演示
1.引入multiprocessing模块
import multiprocessing
2.创建一个进程队列
使用multiprocessing的Queue方法, 参数指定队列的大小
que = multiprocessing.Queue(3)
3.存储一个值到进程中
que.put("111")
que.put(123)
que.put([11, 22, 33])
que.put("haha") # 队列已经满了, 进入阻塞, 等待第一个被取走
4.从内存中获取值
依据队列的特性, 先存的先被取出
que.get() # "111"
que.get() # 123
que.get() # [11, 22, 33]
que.get() # 已经没有数据了, 会阻塞, 等待下一个数据到来
此外, 针对线程的阻塞问题, 提供了一个put_nowait 和 get_nowait方法, 它不会阻塞, 但会报异常, 需要做异常处理
进程通信实例
下面是一个进程通信代码实例, 从一个进程把数据给到另一个进程
import multiprocessing
def put_data(q):
data = [11, 22, 33]
# 写入到队列中
for d in data:
q.put(d)
def get_data(q):
data = []
# 从队列中获取数据
while True:
d = q.get()
data.append(d)
if q.empty():
break
print(data)
def main():
q = multiprocessing.Queue()
t1 = multiprocessing.Process(target=put_data, args=(q,))
t2 = multiprocessing.Process(target=get_data, args=(q,))
t1.start()
t2.start()
if __name__ == "__main__":
main()
运行此程序, 能在get_data进程中输出前一个进程中输入的值