当前位置: Python基础教程 > 16-多任务-多进程 > 阅读正文

python进程间的通信

2021.7.5.   758 次   885字

对于线程, 只需要全局变量即可通信, 而对于进程, 则需要使用内存通信

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进程中输出前一个进程中输入的值

本篇完,还有疑问?

加入QQ交流群:11500065636 IT 技术交流群