为什么apply_async并没有启动任务

新手上路,请多包涵

为什么如下代码的打印为

end

代码如下:

#-*- coding=utf-8 -*-
import os,time,random
from multiprocessing import Process,Pool,Queue

def pidprint(st):
    print("pid(%s):"%os.getpid(),st)


def write(q):
    pidprint("start write")
    while True:
        q.put(time.strftime("%H:%M:%s",time.localtime()))
        time.sleep(1)

def read(q):
    pidprint("start read")
    while True:
        pidprint(q.get(True))

if __name__ == '__main__':
    q = Queue()
    p = Pool(2)
    p.apply_async(read,args=(q,))
    p.apply_async(write,args=(q,))
    time.sleep(1)
    p.close()
    p.join()
    print('end')
阅读 6.4k
1 个回答

队列Queue不能直接创建,而需要从Manager获得, 这样才能在子进程里共享

#-*- coding=utf-8 -*-
import os,time,random
from multiprocessing import Process,Pool,Queue,Manager

def pidprint(st):
    print("pid(%s): %s" % (os.getpid() , st))


def write(q):
    pidprint("start write")
    while True:
        q.put(time.strftime("%H:%M:%s",time.localtime()))
        time.sleep(1)

def read(q):
    pidprint("start read")
    while True:
        pidprint(q.get(True))

if __name__ == '__main__':
    manager = Manager()
    q = manager.Queue()
    p = Pool(2)
    p.apply_async(read,args=(q,))
    p.apply_async(write,args=(q,))
    time.sleep(2)

    p.close()
    p.join()


    print('end')

程序会输出

pid(32157): start read
pid(32158): start write
pid(32157): 21:55:1516974937
pid(32157): 21:55:1516974938
pid(32157): 21:55:1516974939
......

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题