Pathos 多处理不能调用类中的任何包和函数

Posted

技术标签:

【中文标题】Pathos 多处理不能调用类中的任何包和函数【英文标题】:Pathos multiprocessing can't call any package and function in the class 【发布时间】:2016-01-18 13:48:07 【问题描述】:

我想在课堂上进行多处理。似乎只有 pathos.multiprocessing 能够帮助我。但是,当我实现它时,它无法加载我在 main 函数中使用的包。

from pathos.multiprocessing import ProcessingPool;
import time
import sys;
import datetime


class tester:
    def __init__(self):
        self.pool=ProcessingPool(2);

    def func(self,msg):
        print (str(datetime.datetime.now()));
        for i in xrange(1):
            print msg
            sys.stdout.flush();
        time.sleep(2)    

#----------------------------------------------------------------------
    def worker(self):
        """"""
        pool=self.pool
        for i in xrange(10):
               msg = "hello %d" %(i)
               pool.map(self.func,[i])
        pool.close()
        pool.join()
        time.sleep(40)



if __name__ == "__main__":
    print datetime.datetime.now();
    t=tester()
    t.worker()
    time.sleep(60);
    print "Sub-process(es) done."

错误是未定义全局名称“日期时间”。但它适用于主要功能! 我的系统是Win7。

【问题讨论】:

为什么不使用标准的multiprocessing 库? 多处理不能用于调用类函数 @RunpengChen 我和你有同样的问题。你最终是如何解决你的问题的? ***.com/questions/54693080/… 【参考方案1】:

我是pathos 的作者。如果您在非 Windows 系统上执行您的代码,它可以正常工作——即使来自解释器。 (它也适用于文件,同样如此)。

>>> from pathos.multiprocessing import ProcessingPool;
>>> import time
>>> import sys;
>>> import datetime
>>> class tester:
...     def __init__(self):
...         self.pool=ProcessingPool(2);
...     def func(self,msg):
...         print (str(datetime.datetime.now()));
...         for i in xrange(1):
...             print msg
...             sys.stdout.flush();
...         time.sleep(2)    
...     def worker(self):
...         """"""
...         pool=self.pool
...         for i in xrange(10):
...                msg = "hello %d" %(i)
...                pool.map(self.func,[i])
...         pool.close()
...         pool.join()
...         time.sleep(40)
... 
>>> datetime.datetime.now()
datetime.datetime(2015, 10, 21, 19, 24, 16, 131225)
>>> t = tester()
>>> t.worker()
2015-10-21 19:24:25.927781
0
2015-10-21 19:24:27.933611
1
2015-10-21 19:24:29.938630
2
2015-10-21 19:24:31.942376
3
2015-10-21 19:24:33.946052
4
2015-10-21 19:24:35.949965
5
2015-10-21 19:24:37.953877
6
2015-10-21 19:24:39.957770
7
2015-10-21 19:24:41.961704
8
2015-10-21 19:24:43.965193
9
>>>

问题在于 multiprocessing 在 Windows 上根本不同,因为 Windows 没有真正的 fork……因此不如在具有 fork 的系统上灵活。 multiprocessing 有一个 fork pickler,它在幕后产生了一个 subprocess... 而非 Windows 系统可以跨进程使用共享内存。

dill 有一个check 和一个copy 方法,它在一些object 上执行顺序loads(dumps(object)),其中copy 使用共享内存,而check 使用subprocess(就像这样在multiprocessing 的窗口上)。这是 mac 上的 check 方法,显然这不是问题。

>>> import dill
>>> dill.check(t.func)
<bound method tester.func of <__main__.tester instance at 0x1051c7998>>

在windows上你需要做的另一件事是在__main__的开头使用freeze_support(即__main__的第一行)。在非 Windows 系统上没有必要,但在 Windows 上却非常必要。这是文档。

>>> import pathos
>>> print pathos.multiprocessing.freeze_support.__doc__

    Check whether this is a fake forked process in a frozen executable.
    If so then run code specified by commandline and exit.

>>>

【讨论】:

以上是关于Pathos 多处理不能调用类中的任何包和函数的主要内容,如果未能解决你的问题,请参考以下文章

子父类中的构造函数

如何运行嵌套的、分层的 pathos 多处理地图?

类中的继承

使用 pathos ProcessingPool 的地图时如何设置块大小?

PL/SQL 编程(三 )程序包和包体,触发器,视图,索引

悲怆多处理不能腌制