python3中多进程如何共享全局变量?

上代码

from multiprocessing import Pool, Queue
import os, time, random

def long_time_task(name, queue):
    print('Run task %s (%s)...' % (name, os.getpid()))
    start = time.time()
    time.sleep(random.random() * 3)
    end = time.time()
    print('Task %s runs %0.2f seconds.' % (name, (end - start)))
    print(queue.get())

if __name__=='__main__':
    print('Parent process %s.' % os.getpid())
    p = Pool(2)
    q = Queue(10)
    for j in range(10):
        q.put(j)
    for i in range(5):
        p.apply_async(long_time_task, args=(i, q))
    print('Waiting for all subprocesses done...')
    p.close()
    p.join()
    print('All subprocesses done.')

以上代码是不行的,不会执行想要的效果。
如果我想在多个进程中共用一个全局队列,应该如何操作?Google过了,还是不太清除其中的知识点。麻烦前辈们解惑。

阅读 5.7k
1 个回答

多进程共用全局队列,那么无外乎两种情况,一种全局队列存在内存中,比如用redis,一种全局队列存在硬盘上,比如数据库mysql。
多进程通信的话还可以考虑pipe和socket, multiprocessing.Manager.Queue就是pipe通信。

from multiprocessing import Pool, Manager
import os, time, random

def long_time_task(name, queue):
    print('Run task %s (%s)...' % (name, os.getpid()))
    start = time.time()
    time.sleep(random.random() * 3)
    end = time.time()
    print('Task %s runs %0.2f seconds.' % (name, (end - start)))
    print(queue.get())

if __name__=='__main__':
    print('Parent process %s.' % os.getpid())
    p = Pool(2)
    q = Manager().Queue(10)
    for j in range(10):
        q.put(j)
    for i in range(5):
        p.apply_async(long_time_task, args=(i, q))
    print('Waiting for all subprocesses done...')
    p.close()
    p.join()
    print('All subprocesses done.')
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏