instance methods with multiprocessing.Pool(具有多进程.Pool的实例方法)
本文介绍了具有多进程.Pool的实例方法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
在使用实例方法作为func参数时,我一直在使用Pool对象。关于实例状态,这有点令人惊讶。似乎每个块上的实例都会被重置。例如:
import multiprocessing as mp
import logging
class Worker(object):
def __init__(self):
self.consumed = set()
def consume(self, i):
if i not in self.consumed:
logging.info(i)
self.consumed.add(i)
if __name__ == '__main__':
n = 1
logging.basicConfig(level='INFO', format='%(process)d: %(message)s')
worker = Worker()
with mp.Pool(processes=2) as pool:
pool.map(worker.consume, [1] * 100, chunksize=n)
如果n设置为1,则每次都会记录1。如果n设置为20,则记录5次,依此类推。这是什么原因,有什么方法可以避免吗?我还想将initializer池参数用于实例方法,但遇到了类似的问题。
推荐答案
实例方法worker.consume被传递到队列上的工作进程。要做到这一点,必须对其进行腌制。对于每个作业,都会收到相同的PICLE字符串,但在取消该字符串的PICKLE时会创建一个新的实例。您可以看到这里发生的事情的要点,而不需要任何多进程:
In [1]: import pickle
In [2]: class Thing:
...: def __init__(self):
...: self.called = 0
...: def whoami(self):
...: self.called += 1
...: print("{} called {} times".format(self, self.called))
In [3]: pickled = pickle.dumps(Thing().whoami)
In [4]: pickle.loads(pickled)()
<__main__.Thing object at 0x10a636898> called 1 times
In [5]: pickle.loads(pickled)()
<__main__.Thing object at 0x10a6c6550> called 1 times
In [6]: pickle.loads(pickled)()
<__main__.Thing object at 0x10a6bd940> called 1 times
每个Thing实例的ID不同,并且每个实例都有自己的called属性。
这篇关于具有多进程.Pool的实例方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
编程基础网
本文标题为:具有多进程.Pool的实例方法
基础教程推荐
猜你喜欢
- 尝试制作WhatsApp机器人 2022-01-01
- 用 Python 编写 Fortran 无格式文件 2022-01-01
- 使用生成器和迭代器时 Python 多循环失败 2022-01-01
- Discord.py 缺少必需的参数 2022-01-01
- numpy float:比算术运算中内置的慢 10 倍? 2022-01-01
- pyserial - 可以从线程 a 写入串行端口,是否阻塞从线程 b 读取? 2022-01-01
- 将 x 轴刻度更改为自定义字符串 2022-01-01
- 由Python将MP3转换为MIDI(类型错误:无法加载插件:mtg-Melodia:Melodia) 2022-01-01
- 与常规 dict 相比,Python manager.dict() 非常慢 2022-01-01
- 在 Celery 工作人员中捕获 Heroku SIGTERM 以优雅地关 2022-01-01
