私信  •  关注

Mike McKerns

Mike McKerns 最近创建的主题
Mike McKerns 最近回复了
11 年前
回复了 Mike McKerns 创建的主题 » 何时在python中使用map()[重复]

如果您计划编写任何异步、并行或分布式代码,您可能会希望 map 对列表的理解——因为大多数异步、并行或分布式包提供了 地图 函数重载python的 地图 . 然后通过适当的 地图 函数到您的代码的其余部分,您可能不需要修改您的原始串行代码,使其并行运行(等)。

9 年前
回复了 Mike McKerns 创建的主题 » python:pathos多处理池调用类外函数

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

>>>