我正在尝试使用多处理模块加载一堆作业(不返回任何内容-它们只是保存到磁盘),而且我似乎无法退出多处理队列。我已经查看了stackoverflow上的所有链接,而Google仍然不明白为什么作业未正确完成。
代码似乎运行良好(即,它可以按照任务出现的顺序正确地排队和处理任务-而不是为每个内核分配任务列表)。但我似乎无法弄清楚如何退出队列:(
任何建议都值得赞赏,我已经花了几个小时了。
这是我的代码:
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注释掉,我将不再获得正确的行为,并且似乎为内核分配了必须分别完成的作业列表。我需要内核在完成任务后立即将其动态地从池中夺取(否则,有些内核会先于其他内核完成任务,并且系统挂起时间太长,以至于一个内核无法完成许多任务)。
答案 0 :(得分:0)
在最后一行中,您正在null
守护进程。每个Python documentation:
请注意,不允许守护进程创建子进程。否则,如果守护进程在其父进程退出时被终止,它将使其子进程变成孤儿。此外,这些不是Unix守护程序或服务,它们是正常的进程,如果非守护进程已退出,则将终止(而不加入)。