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



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

">

first"函数应该只调用异步"second",这将创建docx。 现在我使用模块asyncio,multiprocessing,concurrent.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')

我确信问题出在"第一"功能上,它称之为"第二"的方式,但一个人对我说,这不是异步的错。在我找到最接近解决方案的方法之前,我经常面临一个问题,即文档仅在整个程序执行过程完成后创建 - 这不是目标。

我正在处理一个没有时间修复的旧项目;里面的基本内容有很多错误,所以浏览器没有帮助 - 它需要一些特定于情况的东西。即便如此,请告诉我如何解决问题。 谢谢。

无需创建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()

相关内容

  • 没有找到相关文章

最新更新