python-多进程的使用(multiprocession)

Python中进程间共享数据,处理基本的queuepipevalue+array外,还提供了更高层次的封装。使用multiprocessing.Manager可以简单地使用这些高级接口。

Manager()返回的manager对象控制了一个server进程,此进程包含的python对象可以被其他的进程通过proxies来访问。从而达到多进程间数据通信且安全

Manager支持的类型有list,dict,Namespace,Lock,RLock,Semaphore,BoundedSemaphore,Condition,Event,Queue,Value和Array。

1. Manager的dict,list使用

import multiprocessing
import time

def worker(d, key, value):
    d[key] = value
 
if __name__ == '__main__':
    mgr = multiprocessing.Manager()
    d = mgr.dict()
    jobs = [ multiprocessing.Process(target=worker, args=(d, i, i*2))
             for i in range(10)
             ]
    for j in jobs:
        j.start()
    for j in jobs:
        j.join()
    print ('Results:' )
    for key, value in enumerate(dict(d)):
        print("%s=%s" % (key, value))
         
# the output is :
# Results:
# 0=0
# 1=1
# 2=2
# 3=3
# 4=4
# 5=5
# 6=6
# 7=7
# 8=8
# 9=9

2. python多进程之间共享queue

默认情况下,使用multiprocess.Queue()只是在两个进程之间进行通信,如下示例:

import multiprocessing, time
 
def task(args):
    count = args[0]
    queue = args[1]
    for i in xrange(count):
        queue.put("%d mississippi" % i)
    return "Done"
 
 
def main():
    q = multiprocessing.Queue()
    pool = multiprocessing.Pool()
    result = pool.map_async(task, [(x, q) for x in range(10)])
    time.sleep(1)
    while not q.empty():
        print q.get()
    print result.get()
 
if __name__ == "__main__":
    main()

3. 如何在多进程间共享queue呢?

我们可以尝试使用multiprocessing.Manager来管理队列,并让不同的进程可以访问它。
解决方案如下:

import multiprocessing
def worker(name, que):
    que.put("%d is done" % name)
 
if __name__ == '__main__':
    pool = multiprocessing.Pool(processes=3)
    m = multiprocessing.Manager()
    q = m.Queue()
    workers = pool.apply_async(worker, (33, q))
发布了20 篇原创文章 · 获赞 30 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/ever_siyan/article/details/104560264
今日推荐