首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多处理->、pathos.multiprocessing和windows

多处理->、pathos.multiprocessing和windows
EN

Stack Overflow用户
提问于 2015-07-30 20:02:14
回答 1查看 4.9K关注 0票数 7

目前,我正在使用python中的标准多处理来生成一组将无限期运行的进程。我并不特别关心性能;每个线程只是在监视文件系统上的不同更改,并且在修改文件时将采取适当的操作。

目前,我有一个解决方案,满足我的需要,在Linux。我有一本函数和参数字典,如下所示:

代码语言:javascript
复制
 job_dict['func1'] = {'target': func1, 'args': (args,)}

对于每个过程,我都创建了一个过程:

代码语言:javascript
复制
 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为每个作业生成线程。我确信,这不是映射的预期用途,但它启动了所有线程,它们在Windows中运行:

代码语言:javascript
复制
import pathos
tp = pathos.pools.ThreadPool()
for k in job_dict.keys():
    tp.uimap(job_dict[k]['target'], job_dict[k]['args'])

但是,现在我不知道如何监视某个线程是否仍然处于活动状态,我正在寻找该线程,以便能够重新启动由于某种原因而崩溃的线程。有什么建议吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-30 20:29:45

我是pathosdill的作者。Process类深埋在pathos.helpers.mp.process.Processpathos中,mp本身就是multiprocessing库的实际分支。multiprocessing中的所有内容都应该可以从那里访问。

关于pathos的另一件事是,它使pool为您保留生命,直到您将它从保持状态中移除。这有助于减少创建“新”池的开销。要移除池,请执行以下操作:

代码语言:javascript
复制
>>> # create
>>> p = pathos.pools.ProcessPool()
>>> # remove
>>> p.clear()

然而,Process并没有这样的机制。

对于multiprocessing,windows不同于Linux和Macintosh…。因为windows没有像linux…那样的适当的…linux可以跨进程共享对象,而在windows上没有共享…。它基本上是一个完全独立的新过程,创建了…因此,序列化必须更好地使对象传递到另一个进程--就像将对象发送到另一台计算机一样。在linux上,您必须这样做才能得到相同的行为:

代码语言:javascript
复制
def check(obj, *args, **kwds):
    """check pickling of an object across another process"""
    import subprocess
    fail = True
    try:
        _x = dill.dumps(x, *args, **kwds)
        fail = False
    finally:
        if fail:
            print "DUMP FAILED"
    msg = "python -c import dill; print dill.loads(%s)" % repr(_x)
    print "SUCCESS" if not subprocess.call(msg.split(None,2)) else "LOAD FAILED"
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31732989

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档