2

我在 python 3.7 上有一个非常简单的脚本,不明白为什么它始终执行,而不是同时执行。错在哪里?这对于保持脚本结构保持原样非常重要,这意味着不要删除类和信号量,我需要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 ticker A,那么我们有结果:

A ended
0.12 execution seconds
4

1 回答 1

1

您的代码在异步中完美运行,因为它应该是。由于每个任务都需要相同的时间和计算能力来完成,并且在操作中它不会等待任何任务完成,因此可以始终如一地执行。

试试这个

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

这一次它将同时执行,因为不需要计算并且系统可以自由地提供资源。

于 2020-06-23T21:11:12.687 回答