gpt4 book ai didi

python:了解简单for循环的多处理

转载 作者:太空宇宙 更新时间:2023-11-04 10:45:41 25 4
gpt4 key购买 nike

我以前从未使用过多处理模块。

有没有办法将 for 循环变成并发子进程。喜欢

for i in xrange(10): list.append(i)

不是顺序的,而是并行的?

我尝试使用队列模块

q = Queue.Queue()

for i in xrange(10):
q.put(i)


def addto(q):
new.append(q.get(block=False))


processes = [Process(target=addto, args=(q,))]
for p in processes:
p.start()
for p in processes:
p.join()

它给出了一个很长的错误,我粘贴了最后一个:

C:\WinPython-64bit-2.7.3.3\python-2.7.3.amd64\lib\pickle.pyc in save_global(self, obj, name, pack)
746 raise PicklingError(
747 "Can't pickle %r: it's not found as %s.%s" %
--> 748 (obj, module, name))
749 else:
750 if klass is not obj:

PicklingError: Can't pickle <type 'thread.lock'>: it's not found as thread.lock

我也经常看到这个:

processes = [Process(target=func, args=(q,x)) for i in some iterable]

好吧,有一个 func(q,x) 好吧,我有一个 map() 或 for 循环/当进入我的函数 func() 时,为什么还要在进程中迭代?我不想使用 process 循环整个函数,而只是将那些特定的循环变成并行进程。为什么要用 args 遍历目标函数?我的意思是当我已经 q.put 了吗?

如果我这样做会怎样

processes = Process(target=addto, args=(q,)).start()

最佳答案

Queue.Queue 用于线程安全队列,线程原语不能转移到其他进程。你要multiprocessing.Queue反而;简单地替换

import Queue
q = Queue.Queue()

import multiprocessing
q = multiprocessing.Queue()

此外,new 必须是 multiprocessing.managers.list 类型.

但是,请注意,您只是在复制 multiprocessing.Pool ;你可以写

import multiprocessing

new = multiprocessing.Manager().list()
def addto(val):
new.append(val)

pool = multiprocessing.Pool()
for i in xrange(10):
pool.apply_async(addto, (i,))
pool.close()
pool.join()
print(new)

关于python:了解简单for循环的多处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17514667/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com