社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

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

jason • 6 年前 • 2045 次点击  

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

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。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/41048
文章 [ 1 ]  |  最新文章 6 年前
Mike McKerns
Reply   •   1 楼
Mike McKerns    10 年前

我是 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.

>>>