【发布时间】:2015-10-22 08:30:52
【问题描述】:
我目前在 python 中使用标准的多处理来生成一堆将无限期运行的进程。我并不特别关心性能。每个线程只是在观察文件系统上的不同变化,并在文件被修改时采取适当的行动。
目前,我有一个在 Linux 中可以满足我需求的解决方案。我有一个函数和参数字典,如下所示:
job_dict['func1'] = {'target': func1, 'args': (args,)}
对于每一个,我创建一个流程:
import multiprocessing
for k in job_dict.keys():
jobs[k] = multiprocessing.Process(target=job_dict[k]['target'],
args=job_dict[k]['args'])
有了这个,我可以跟踪每一个正在运行的任务,并在必要时重新启动因任何原因崩溃的作业。
这在 Windows 中不起作用。我使用的许多函数都是包装器,使用各种functools 函数,并且我收到有关无法序列化函数的消息(请参阅What can multiprocessing and dill do together?)。我还没有弄清楚为什么我在 Linux 中没有出现此错误,但在 Windows 中却出现了。
如果我在 Windows 中启动我的进程之前导入 dill,我不会收到序列化错误。然而,这些进程实际上并没有做任何事情。我不知道为什么。
然后我切换到pathos 中的多处理实现,但在标准multiprocessing 模块中没有找到简单的Process 类的模拟。我能够使用pathos.pools.ThreadPool 为每个作业生成线程。我敢肯定,这不是 map 的预期用途,但它启动了所有线程,并且它们在 Windows 中运行:
import pathos
tp = pathos.pools.ThreadPool()
for k in job_dict.keys():
tp.uimap(job_dict[k]['target'], job_dict[k]['args'])
但是,现在我不确定如何监视线程是否仍然处于活动状态,我正在寻找它以便我可以重新启动由于某种原因而崩溃的线程。有什么建议吗?
【问题讨论】:
标签: python multiprocessing pickle dill pathos