如何使用 asyncio (parallel/multiprocessing) 在 python 中进行数学运算?

How to do math operations in python with asyncio (parallel/multiprocessing)?

我在 python 3.7 上有一个非常简单的脚本,但不明白为什么它始终如一地执行,而不是同时执行。错误在哪里?这对于保持脚本结构原样非常重要,这意味着不要删除 class 和信号量,并且 我需要在 op() 中计算数学运算 。我尝试使用 self.op(),删除 async,但结果相同。

import time
import asyncio


class Trader:

    def __init__(self, ticker):
        self.ticker = ticker

    async def _init(self):
        # asyncio.run(self.op())
        await self.op()
        print('{} ended'.format(self.ticker))

    async def op(self):
        a = range(1000000) 
        b = [] 
        for i in a:
            b.append(i*2)


async def fetch_tickers():
    return await asyncio.gather(*(asyncio.ensure_future(safe_trader(ticker)) for ticker in ['A', 'B', 'C', 'D', 'E', 'F', 'G']))

async def safe_trader(ticker):
    async with sem:
        t = Trader(ticker)
        return await t._init()

if __name__ == '__main__':
    start_time = time.time()
    sem = asyncio.Semaphore(10)
    loop = asyncio.get_event_loop()
    results = loop.run_until_complete(fetch_tickers())
    print("%.2f execution seconds" % (time.time() - start_time))

结果:

A ended
B ended
C ended
D ended
E ended
F ended
G ended
0.82 execution seconds

如果我只留下 1 个代码 A,那么我们有结果:

A ended
0.12 execution seconds

您的代码在异步模式下运行良好,正如预期的那样。 由于每个任务都需要相同的时间和计算能力才能完成,并且在 op 中,它不会等待任何任务完成它,因此始终如一地执行。

试试这个

async def op(self):
    await asyncio.sleep(2)

这次会同时执行,因为不需要计算,系统可以自由提供资源。