【问题标题】:python: understanding multiprocessing for a simple for looppython:理解一个简单的for循环的多处理
【发布时间】:2013-07-08 02:28:21
【问题描述】:

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

有没有办法可以将 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() 那么为什么还要在进程中迭代呢? 我不想使用进程循环整个函数,而只是将那些特定的循环变成并行进程。为什么用 args 迭代目标函数?我的意思是当我已经 q.put 的时候?

如果我这样做了怎么办

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

【问题讨论】:

  • "我的意思是当我已经 q.put 时?"确切地!你的例子太琐碎了。即使没有q.put() 循环,也不足以证明在进程之间划分它是合理的。
  • @BrianCain 我知道。它很愚蠢。但我可以使用线程来理解它们是如何工作的。我想知道进程是如何工作的。特别是我的问题是使循环并行。

标签: python python-2.7 python-multithreading


【解决方案1】:

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)

【讨论】:

  • 伟大的洞察力。我确实从多处理中导入了队列。好的,我更新一下会发生什么
  • new 还是空的 new = []
  • @user2290820 更新了一个完整的示例,对我来说效果很好(默认情况下,它使用每个虚拟 CPU 的进程,因此对于多处理器机器,您甚至会看到不同的结果,具体取决于调度)。这个例子对你有用吗?如果没有,您会得到什么错误消息和输出?
  • 谢谢。我将回到多处理文档。这个多处理文档不是那么容易理解,因为它从一个更大的例子开始。
猜你喜欢
  • 2013-12-10
  • 1970-01-01
  • 2016-03-31
  • 1970-01-01
  • 2018-08-06
  • 2020-10-14
  • 2022-11-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多