我试图理解为什么第二个函数没有被调用,你是不是可以使用带有多处理的While循环?如果有人有任何建议,我将不胜感激!
import multiprocessing
import time
from multiprocessing import Pool
def func_ONE(data):
while True:
print 'Func ONE'
print str(data)
time.sleep(10)
def func_TWO(data):
while True:
print 'Func TWO'
print str(data)
time.sleep(10)
def worker(params):
param1, param2 = params
if param1:
func_ONE(param1)
if param2:
func_TWO(param2)
data1 = 'bob'
data2 = 'joe'
if __name__ == '__main__':
params = zip([data1], [data2])
pool = multiprocessing.Pool()
results = pool.map(worker, params)
答案 0 :(得分:0)
import multiprocessing, Queue, time
class Worker(multiprocessing.Process):
def __init__(self, work_queue):
# base class initialization
multiprocessing.Process.__init__(self)
# job management stuff
self.work_queue = work_queue
self.kill_received = False
def run(self):
while not self.kill_received:
# get a task
try:
n_job, data = self.work_queue.get_nowait()
except Queue.Empty:
break
# the actual processing
print "Starting %d ..." % n_job
print str(data)
time.sleep(10)
if __name__ == "__main__":
data1 = 'bob'
data2 = 'joe'
work_queue = multiprocessing.Queue()
for n, data in enumerate([data1, data2]):
work_queue.put( (n, data) )
num_processes = 2
for i in range(num_processes):
worker = Worker(work_queue)
worker.start()
我想你想做的就是这样。
答案 1 :(得分:0)
如果您希望两个函数并行运行,则需要让它们从不同的worker
调用而不是同一个函数运行。
根本不修改子进程代码,只需在主进程代码中以不同方式构造params
即可:
params = [(data1, None), (None, data2)]
但我不确定这是否是最好的做事方式。如果在2元组中有多个非假名值作为worker
与[{1}},map
作为参数传递,那么可能map
不是正确的用法。如果需要,您可以使用map
在不同的工作进程中调用不同的函数:
apply_asyc
现在,您的工作人员永远不会返回,因此调用if __name__ == '__main__':
pool = multiprocessing.Pool()
results1 = pool.apply_async(func_ONE, (data1,))
results2 = pool.apply_async(func_TWO, (data2,))
将永远阻止主进程,这可能并不理想(但这是一个更大的设计问题)。