我正在尝试使用4个进程来实现4个异步方法。
这是我的1异步方法(x)的代码:
from multiprocessing import Pool
import time
def x(i):
while(i < 100):
print(i)
i += 1
time.sleep(1)
def finish(str):
print("done!")
if __name__ == "__main__":
pool = Pool(processes=5)
result = pool.apply_async(x, [0], callback=finish)
print("start")
根据:https://docs.python.org/2/library/multiprocessing.html#multiprocessing.JoinableQueue Pool中的参数进程是worker的数量。
我如何使用这些工人?
编辑:我的ASYNC课程
from multiprocessing import Pool
import time
class ASYNC(object):
def __init__(self, THREADS=[]):
print('do')
pool = Pool(processes=len(THREADS))
self.THREAD_POOL = {}
thread_index = 0
for thread_ in THREADS:
self.THREAD_POOL[thread_index] = {
'thread': thread_['thread'],
'args': thread_['args'],
'callback': thread_['callback']
}
pool.apply_async(self.run, [thread_index], callback=thread_['callback'])
self.THREAD_POOL[thread_index]['running'] = True
thread_index += 1
def run(self, thread_index):
print('enter')
while(self.THREAD_POOL[thread_index]['running']):
print("loop")
self.THREAD_POOL[thread_index]['thread'](self.THREAD_POOL[thread_index])
time.sleep(1)
self.THREAD_POOL[thread_index]['running'] = False
def wait_for_finish(self):
for pool in self.THREAD_POOL:
while(self.THREAD_POOL[pool]['running']):
time.sleep(1)
def x(pool):
print(str(pool))
pool['args'][0] += 1
def y(str):
print("done")
A = ASYNC([{'thread': x, 'args':[10], 'callback':y}])
print("start")
A.wait_for_finish()
答案 0 :(得分:0)
multiprocessing.Pool
旨在成为将工作分配给工作人员的便捷方式,而不必担心哪个工作人员工作。它有一个大小的原因是允许你懒得将工作分配到队列的速度,并限制创建子进程的昂贵(相对)开销。
因此,您的问题的答案原则上是您无法访问池中的个别工作人员。如果您希望能够单独解决员工问题,则需要实施自己的工作分配系统并使用multiprocessing.Process
,例如:
from multiprocessing import Process
def x(i):
while(i < 100):
print(i)
i += 1
pools = [Process(target=x, args=(1,)) for _ in range(5)]
map(lambda pool: pool.start(), pools)
map(lambda pool: pool.join(), pools)
print('Done!')
现在您可以直接访问每个工作人员。如果您希望能够在每个工作人员运行时动态地将工作发送给每个工作人员(不仅仅是像我在我的示例中那样给一件事做),那么您必须自己实施,可能使用multiprocessing.Queue
。查看multiprocessing
的代码,了解该分发如何分配给其工作人员,以了解如何执行此操作。
你为什么要这样做呢?如果只关心工人是否能够有效地安排工作,那么我的建议就是信任multiprocessing
以便为你做到这一点,除非你有充分的证据表明在你的情况下不适合某种原因。