我正试图使用多处理模块加载一堆作业(这些作业不返回任何内容,只是保存到磁盘(,但我似乎无法退出多处理队列。我查了stackoverflow上的所有链接,谷歌仍然不明白为什么这些工作没有正确完成。
代码似乎运行良好(即,它按照任务的任何顺序正确地对任务进行排队和处理,而不是为每个核心分配任务列表(。但我似乎不知道如何退出队列:(
非常感谢您的建议,我已经花了好几个小时。
这是我的代码:
import multiprocessing as mp
# make arg list first
args_in = []
for channel in channels:
args_in.append(...) # append some stuff
# make a queue and add list to queue:
#q = mp.Queue()
q = mp.JoinableQueue()
for arg in args_in:
q.put(arg) # add list of args
# worker function
def worker(q):
for item in iter(q.get, None):
res = cluster_channels_chunks_args(item)
q.task_done()
# make a list of processes and add worker function
procs = []
for i in range(CONFIG.resources.n_processors):
procs.append(mp.Process(target=worker, args=(q,)))
procs[-1].daemon = True
procs[-1].start()
for p in procs:
p.join()
[编辑]如果我注释掉procs[-1].daemon=True,我将不再得到正确的行为,并且核心似乎被分配了一个作业列表,每个作业都必须完成。我需要内核在作业完成后立即从池中动态抓取作业(否则,一些内核会在其他内核之前完成作业,并且我会因为等待一个内核完成多个作业而导致系统挂起太长时间(。
在最后一行中,您是join
的守护进程。根据Python文档:
请注意,守护进程不允许创建子进程。否则,如果守护进程在其父进程退出时终止,它的子进程将成为孤立进程。此外,这些不是Unix守护进程或服务,它们是正常进程,如果非守护进程退出,它们将被终止(而不是加入(。