【问题标题】:How I can do something right after one instance created with Python3?如何在使用 Python3 创建一个实例后立即做某事?
【发布时间】:2020-08-31 18:13:11
【问题描述】:

我在 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.'

【问题讨论】:

    标签: python multiprocessing threadpool


    【解决方案1】:

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

    multiprocessing.map()

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

    所以,您对tpool.map 调用所做的操作等同于do_something(async_result.get())——即。只发送第一个Writer 到do_something

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

    【讨论】:

    • 我尝试了你的建议,但没有得到我想要的。我认为这个问题与“async_reulst.get()”有关。 get 函数似乎在等待创建的所有实例。谢谢你的建议。
    • 啊,我相信问题是由于使用了starmap_async。任何*map* 函数都以正确的顺序返回结果。因此,即使它们是并行执行的,也必须先完成所有操作,然后才能返回任何值。因此.get() 将等待所有完成。你应该改用apply_async。
    • 哦,我明白了。我将尝试 apply_async。我认为它可以帮助解决我的问题。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-31
    • 2014-03-22
    • 1970-01-01
    相关资源
    最近更新 更多