Tag: 多重处理

Python多重处理优雅退出如何?

import multiprocessing import time class testM(multiprocessing.Process): def __init__(self): multiprocessing.Process.__init__(self) self.exit = False def run(self): while not self.exit: pass print "You exited!" return def shutdown(self): self.exit = True print "SHUTDOWN initiated" def dostuff(self): print "haha", self.exit a = testM() a.start() time.sleep(3) a.shutdown() time.sleep(3) print a.is_alive() a.dostuff() exit() 我只是想知道如何来上面的代码不真正打印“你退出”。 我究竟做错了什么? 如果是的话,有人可以指出我正确的退出方式吗? (我不是指process.terminate或kill)

显示Python多处理池地图调用的进度?

我有一个脚本,它成功地做了一个多处理池集合的任务与imap_unordered()调用: p = multiprocessing.Pool() rs = p.imap_unordered(do_work, xrange(num_tasks)) p.close() # No more work p.join() # Wait for completion 然而,我的num_tasks是大约25万,所以join()locking主线程10秒左右,我希望能够增量回显到命令行显示主进程没有被locking。 就像是: p = multiprocessing.Pool() rs = p.imap_unordered(do_work, xrange(num_tasks)) p.close() # No more work while (True): remaining = rs.tasks_remaining() # How many of the map call haven't been done yet? if (remaining == 0): break # Jump […]

Python:学习“multiprocessing.Manager”的好地方?

我想学习使用multiprocessing.Manager 。 我看了文档,但对我来说不够简单。 任何人都知道一个很好的教程或类似的东西?

Python Multiprocessing.Pool惰性迭代

我想知道python的Multiprocessing.Pool类与地图,imap和map_async工作的方式。 我特别的问题是,我想映射一个迭代器,创build内存重的对象,并不希望所有这些对象同时生成内存。 我想看看各种map()函数是否会干扰我的迭代器,或者只是在subprocess缓慢前进时智能地调用next()函数,所以我篡改了一些testing: def g(): for el in xrange(100): print el yield el def f(x): time.sleep(1) return x*x if __name__ == '__main__': pool = Pool(processes=4) # start 4 worker processes go = g() g2 = pool.imap(f, go) g2.next() 依此类推,使用map,imap和map_async。 然而,这是最公然的例子,因为简单地调用next()在g2上的一次打印出我的生成器g()中的所有元素,而如果imap是这样做的“懒惰”,我希望它只能调用go.next ()一次,因此只打印出'1'。 有人可以清理发生的事情吗?如果有什么办法让stream程池“懒惰地”根据需要评估迭代器? 谢谢, 加布

在几个进程之间共享一个结果队列

multiprocessing模块的文档显示了如何将一个队列传递multiprocessing.Process启动的进程。 但是,我怎样才能与由apply_async启动的asynchronous工作进程共享一个队列呢? 我不需要dynamicjoin或其他任何东西,只是一种让工人(反复)将结果报告回基地的方法。 import multiprocessing def worker(name, que): que.put("%d is done" % name) if __name__ == '__main__': pool = multiprocessing.Pool(processes=3) q = multiprocessing.Queue() workers = pool.apply_async(worker, (33, q)) 这失败了: RuntimeError: Queue objects should only be shared between processes through inheritance 。 我明白这意味着什么,我理解inheritance的build议,而不是要求酸洗/取消(以及所有特殊的Windows限制)。 但是,我如何以一种有效的方式来传递队列呢? 我找不到一个例子,而且我尝试了几种以各种方式失败的替代scheme。 请帮助?

又一个混乱的多处理错误,'模块'对象没有属性'f'

我知道这已经回答了,但似乎直接执行脚本“python filename.py”不起作用。 我在SuSE Linux上有Python 2.6.2。 码: #!/usr/bin/python # -*- coding: utf-8 -*- from multiprocessing import Pool p = Pool(1) def f(x): return x*x p.map(f, [1, 2, 3]) 命令行: > python example.py Process PoolWorker-1: Traceback (most recent call last): File "/usr/lib/python2.6/multiprocessing/process.py", line 231, in _bootstrap self.run() File "/usr/lib/python2.6/multiprocessing/process.py", line 88, in run self._target(*self._args, **self._kwargs) File "/usr/lib/python2.6/multiprocessing/pool.py", […]

multiprocessing.Pool:map_async和imap有什么区别?

我试图学习如何使用Python的multiprocessing包,但我不明白map_async和imap之间的区别。 我注意到map_async和imap都是asynchronous执行的。 那么我应该什么时候使用一个呢? 而我应该如何检索由map_async返回的结果? 我应该用这样的东西吗? def test(): result = pool.map_async() pool.close() pool.join() return result.get() result=test() for i in result: print i

Python多处理和一个共享计数器

我遇到了多处理模块的麻烦。 我正在使用地图方法的工作者池从许多文件加载数据,并为他们每个我用自定义函数分析数据。 每次处理一个文件,我都想更新一个计数器,以便能够跟踪还有多less文件需要处理。 这里是示例代码: def analyze_data( args ): # do something counter += 1 print counter if __name__ == '__main__': list_of_files = os.listdir(some_directory) global counter counter = 0 p = Pool() p.map(analyze_data, list_of_files) 我找不到解决scheme。

使用Python的Multiprocessing模块来执行SEAWAT / MODFLOW模型运行

我试图在我的8处理器64位Windows 7机器上完成100个模型的运行。 我想同时运行7个模型的实例,以减less我的总运行时间(每个模型运行大约9.5分钟)。 我已经看了几个有关Python的Multiprocessing模块的线程,但我仍然缺less一些东西。 使用多处理模块 如何在多处理器系统上产生并行subprocess? Python多处理队列 我的过程: 我有100个不同的参数集,我想通过SEAWAT / MODFLOW来比较结果。 我已经为每个模型运行预build了模型input文件,并将它们存储在自己的目录中。 我希望能够做的是一次运行7个模型,直到所有的实现已经完成。 不需要进程之间的通信或显示结果。 到目前为止,我只能依次产生模型: import os,subprocess import multiprocessing as mp ws = r'D:\Data\Users\jbellino\Project\stJohnsDeepening\model\xsec_a' files = [] for f in os.listdir(ws + r'\fieldgen\reals'): if f.endswith('.npy'): files.append(f) ## def work(cmd): ## return subprocess.call(cmd, shell=False) def run(f,def_param=ws): real = f.split('_')[2].split('.')[0] print 'Realization %s' % real mf2k = […]

Python多处理全局variables更新不返回给父

我正在尝试从subprocess返回值,但这些值是不可取的。 所以我在线程模块中使用了全局variables,但是在使用多处理模块时,还没有能够检索在subprocess中完成的更新。 我希望我失去了一些东西。 最后打印的结果始终与赋予variablesdataDV03和dataDV04的初始值相同。 subprocess正在更新这些全局variables,但是这些全局variables在父进程中保持不变。 import multiprocessing # NOT ABLE to get python to return values in passed variables. ants = ['DV03', 'DV04'] dataDV03 = ['', ''] dataDV04 = {'driver': '', 'status': ''} def getDV03CclDrivers(lib): # call global variable global dataDV03 dataDV03[1] = 1 dataDV03[0] = 0 # eval( 'CCL.' + lib + '.' + […]