首页 > 解决方案 > 如何在使用 Python3 创建一个实例后立即做某事?

问题描述

我在 Python3 中使用多处理时遇到问题。我使用多处理读取多个文件并使用读取数据创建实例。在阅读和创建实例之后,我想要的是在创建一个实例之后,做一些事情。但它不像我预期的那样工作。

下面的代码实际上会等待所有创建的实例,然后执行 do_something 代码。这不是我所期望的。

import multiprocessing
import os
from itertools import repeat

pool = multiprocessing.Pool(processes=3)
pool = multiproccesiin.pool.ThreadPool(processes=1)
events = list(map(lambda x: os.path.split(x)[1].split('.')[0], events))
async_results = pool.startmap_async(Writer,zip(events, repeat(self._settings['TANKDIR']), repeat(self._settings['CATDIR']),repeat(self._settings['DATADIR'])))
# Writer is my class init.
# The earliest created instance takes about 4.5 sec.
tpool.map(do_something, async_results.get())
# I thought tpool.map part start do_something right after one instance created.'

标签: pythonmultiprocessingthreadpool

解决方案


tpool.map(do_something, async_results.get())只会将第一个Writer实例发送到do_something函数。

多处理.map()

此方法将可迭代对象分割成多个块,将它们作为单独的任务提交给进程池。这些块的(近似)大小可以通过将 chunksize 设置为正整数来指定。

因此,您对tpool.map呼叫所做的操作等同于do_something(async_result.get())-- 即。只发送第一个Writerdo_something

在不了解您的用例的情况下,解决方案可能很简单tpool.map(do_something, list(async_results))


推荐阅读