进程通信


进程通信可以通过队列实现。先介绍一下Queue的简单使用。

from queue import Queue,LifoQueue,PriorityQueue

q = Queue(5)
q.put('A')
q.put('B')
q.put('C')
q.put('D')
q.put('E')

if q.full():
    print("队列已满!!!!")
else:
    q.put('F',timeout=2) #如果队列满了,则只能等待;除非有“空地”才能添加成功。

q.get()
q.get()
q.get()
q.get()
q.get()
if q.empty():
    print('队列已空')
else:
    q.get(timeout=2) # 如果队列为空,取元素会阻塞。

输出:

队列已满!!!!
队列已空

通过队列实现进程通信

用例:

from multiprocessing import Process,Queue # Queue别导错了!
from time import sleep


def download(q):
    images = ['girl.jpg','boy.jpg','man.jpg']
    for image in images:
        print('正在下载:',image)
        sleep(0.5)
        q.put(image)

def getfile(q):
    while True:
        try:
            file = q.get(timeout = 2)
            print('{} 保存成功!!!'.format(file))
        except:
            print('全部保存完毕!')
            break

if __name__ == '__main__':
    q = Queue(5)
    p1 = Process(target=download,args=(q,))
    p2 = Process(target=getfile, args=(q,))

    p1.start()
    p2.start()

    p1.join()
    p2.join()

输出:

正在下载: girl.jpg
正在下载: boy.jpg
girl.jpg 保存成功!!!
正在下载: man.jpg
boy.jpg 保存成功!!!
man.jpg 保存成功!!!
全部保存完毕!