Python 3.x 多进程:持久池?
我有如下代码:Python 3.x 多进程:持久池?,python-3.x,multiprocessing,pool,persistent,Python 3.x,Multiprocessing,Pool,Persistent,我有如下代码: def expensive(self,c,v): ..... def inner_loop(self,c,collector): self.db.query('SELECT ...',(c,)) for v in self.db.cursor.fetchall() : collector.append( self.expensive(c,v) ) def method(self): # create a Pool #
def expensive(self,c,v):
.....
def inner_loop(self,c,collector):
self.db.query('SELECT ...',(c,))
for v in self.db.cursor.fetchall() :
collector.append( self.expensive(c,v) )
def method(self):
# create a Pool
#join the Pool ??
self.db.query('SELECT ...')
for c in self.db.cursor.fetchall() :
collector = []
#RUN the whole cycle in parallel in separate processes
self.inner_loop(c, collector)
#do stuff with the collector
#! close the pool ?
外环和内环都有数千个步骤。。。
我想我知道如何运行一组进程。
我找到的所有例子或多或少都说明了这一点
但在我的例子中,我需要一个持久池,然后提供数据(c值)。一旦内部循环过程完成,我必须提供下一个可用的c值。
并保持流程运行并收集结果
我该怎么做
我有一个笨拙的想法:
def method(self):
ws = 4
with Pool(processes=ws) as pool :
cs = []
for i,c in enumerate(..) :
cs.append(c)
if i % ws == 0 :
res = [pool.apply(self.inner_loop, (c)) for i in range(ws)]
cs = []
collector.append(res)
这会让同一个游泳池继续运行吗!!i、 不是每次都有新的流程吗?我
我是否需要“if I%ws==0”部分,或者我可以使用imap()、map_async()和池obj在可用工作线程耗尽时阻止循环,并在某些工作线程释放时继续?是的,工作方式是: 池中的工作进程通常在池的工作队列的整个持续时间内处于活动状态 因此,只需通过
imap
将所有工作提交到池中就足够了:
将池(进程=4)作为池:
初始结果=db.fetchall(“从外部选择c”)
结果=[pool.imap(self.internal_循环,(c,))用于初始_结果中的c]
这就是说,如果您真的这样做是为了从数据库中获取数据,那么将更多的处理向下移动到该层可能更有意义(将计算带到数据中,而不是将数据带到计算中)。您已经看到了吗?如果是这样的话,你能详细说明一下你特别困惑的是什么吗?我主要的困惑是如何划分N-c值并保持N进程的状态。for循环还必须一次输入N个值,但它一次生成一个值。谢谢。。在我的例子中,对大查询进行分区、预处理初始批处理并使用池使我的工作在1小时内完成,而不是5++小时;)