如何从另一个函数进行异步函数调用?

时间:2019-12-09 07:37:31

标签: python asynchronous multiprocessing python-asyncio

目标是在执行程序其余部分的过程中并行创建docx文档。

“第一个”函数应仅调用异步“第二个”,这将创建docx。 现在,我使用asyncio,multiprocessing,current.futures模块,但未创建docx:

def first(self, event):
    pool = ThreadPoolExecutor(max_workers=multiprocessing.cpu_count())
    loop = asyncio.get_event_loop()
    loop.run_in_executor(pool, self.second)

async def second(self):
    document = Document()
    document.save('test.docx')

我确定问题出在“第一个”函数,即所谓的“第二个”函数上,但是一个人对我说,这不是异步的错。在找到最接近解决方案的方法之前,我一直面临着这样的问题:仅在完成整个程序执行过程之后才创建文档-这不是目标。

我正在处理一个没有时间修复的旧项目;里面的基本内容有很多错误,因此浏览器没有帮助-它需要针对具体情况的某些东西。即使这样,请告诉我如何解决问题。 谢谢。

1 个答案:

答案 0 :(得分:1)

无需创建second异步。我假设您可以将其更改为常规功能。

您可能只想在后台操作系统线程中开始文件创建:

def first():
    with ThreadPoolExecutor(max_workers=1) as executor:
        fut = executor.submit(second)  # start `second` in background

        # rest of the program

        fut.result()  # make sure `second` is finished


def second():
    document = Document()
    document.save('test.docx')

万一瓶颈是磁盘I / O,就可以解决问题。如果瓶颈是CPU,则应考虑使用ProcessPoolExecutor而不是ThreadPoolExecutor


以下是可重复使用的代码:

import time
from concurrent.futures import ThreadPoolExecutor


def first():
    with ThreadPoolExecutor(max_workers=1) as executor:
        fut = executor.submit(second)  # start `second` in background

        print('Rest of the program started')
        time.sleep(2)  # rest of the program
        print('Rest of the program finished')

        fut.result()  # make sure `second` is finished


def second():
    time.sleep(1)  # create doc
    print('Doc created')


first()