代码之家  ›  专栏  ›  技术社区  ›  jason

python:pathos多处理池调用类外函数

  •  0
  • jason  · 技术社区  · 6 年前

    我想在课堂上做多处理。似乎只有病理学多处理才能帮助我。但是,当我实现它时,它无法加载我在主函数中使用的包。

    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."
    

    错误的是未定义全局名称“datetime”。但它的主要功能是! 我的系统是Win7。

    0 回复  |  直到 9 年前
        1
  •  3
  •   Mike McKerns    9 年前

    我是 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 因此,它不像具有 . 多处理 有一个叉子腌菜机,在被子下面 subprocess 而非windows系统可以跨进程利用共享内存。

    dill 有一个 check 和A copy 方法,该方法执行 loads(dumps(object)) 对一些 object 在哪里 复制 使用共享内存,而 检查 使用 子过程 (与中的Windows相同 多处理 )这里是 检查 Mac上的方法,显然这不是问题所在。

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

    你需要在windows上做的另一件事是 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.
    
    >>>