试图了解Python多处理文档。 我会将其放在meta上,但不确定是否对以后的搜索者有价值。
关于这些示例与多处理的关系,我需要一些指导。
我是否正确地认为多处理正在使用多个进程(因此是CPU)来分解可迭代的任务并因此缩短其持续时间?
from multiprocessing import Process
def f(name):
print('hello', name)
if __name__ == '__main__':
p = Process(target=f, args=('bob',))
p.start()
p.join()
我们正在启动一个流程;但是如何开始多次完成任务?我要遍历Process + start()行吗?
然而,在文档的后面没有示例,例如:
for x in range(5):
p[x]=Process(target=f, args=('bob',))
p[x].start()
p.join()
这将是“现实生活”的实现吗?
这是“队列示例”:
from multiprocessing import Process, Queue
def f(q):
q.put([42, None, 'hello'])
if __name__ == '__main__':
q = Queue()
p = Process(target=f, args=(q,))
p.start()
print(q.get()) # prints "[42, None, 'hello']"
p.join()
但是,这种多重处理又如何呢?这仅仅是开始一个进程,然后让它在队列中运行对象? 如何使多个进程启动并运行队列中的对象?
最后是泳池:
from multiprocessing import Pool
import time
def f(x):
return x*x
if __name__ == '__main__':
with Pool(processes=4) as pool: # start 4 worker processes
result = pool.apply_async(f, (10,)) # evaluate "f(10)" asynchronously in a single process
print(result.get(timeout=1)) # prints "100" unless your computer is *very* slow
是否有四个进程同时执行10x10,并等待所有四个进程返回,还是只有一个进程这样做,因为我们只给了池一个参数? 如果是前者:那会不会比仅仅拥有一个人慢呢?那记忆力呢?我们将进程1的结果保存到进程4返回RAM还是被打印出来?
print(pool.map(f, range(10))) # prints "[0, 1, 4,..., 81]"
it = pool.imap(f, range(10))
print(next(it)) # prints "0"
print(next(it)) # prints "1"
print(it.next(timeout=1)) # prints "4" unless your computer is *very* slow
result = pool.apply_async(time.sleep, (10,))
print(result.get(timeout=1)) # raises multiprocessing.TimeoutError