<p>这是我的“没有答案”,我知道Stack Overflow喜欢。。。你知道吗</p>
<blockquote>
<p>Is there any way to do this without having to implement an asynchronous copy of all my functions?</p>
</blockquote>
<p>我认为没有。制作一个“一揽子翻译程序”将函数转换为本地协同程序似乎几乎是不可能的。这是因为使同步函数异步不仅仅是在它前面抛出一个<code>async</code>关键字和几个<code>await</code>语句。你知道吗</p>
<p>你的<code>def func2(): time.sleep(1)</code>说明了这一点。同步函数将进行阻塞调用,例如<code>time.sleep()</code>;异步(本机协程)将等待非阻塞协程。正如您所指出的,使这个函数异步化不仅需要使用<code>async def func()</code>,而且需要等待<code>asyncio.sleep()</code>。现在让我们假设您调用的不是<code>time.sleep()</code>,而是更复杂的阻塞函数。您构建了某种花哨的decorator,将名为<code>run_async</code>的<a href="https://stackoverflow.com/q/338101/7954504">function attribute</a>放在修饰函数上,这是一个可调用的函数。但是,如果定义了<code>func2()</code>中的阻塞调用,那么修饰符如何知道如何将这些阻塞调用“转换”为它们的协同程序等价物呢?我想不出有什么魔法能聪明到将同步函数中的所有调用都转换成它们的<code>await</code>可对应的调用。你知道吗</p>
<p>在您的评论中,您提到这是针对HTTP请求的。对于一个真实的例子,<code>requests</code>和<code>aiohttp</code>包之间的调用签名和api的差异。在<code>aiohttp</code>中,<code>.text()</code>是实例<a href="https://github.com/aio-libs/aiohttp/blob/76268e31630bb8615999ec40984706745f7f82d1/aiohttp/client_reqrep.py#L974" rel="nofollow noreferrer">method</a>;在<code>requests</code>中,<code>.text</code>是实例<a href="https://github.com/requests/requests/blob/75bdc998e2d430a35d869b2abf1779bd0d34890e/requests/models.py#L835" rel="nofollow noreferrer">property</a>。你怎么能建立一个足够聪明的东西来知道这样的区别呢?你知道吗</p>
<p>我并不想让人沮丧,但我认为使用线程将更现实。你知道吗</p>