如何使用 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)
这次会同时执行,因为不需要计算,系统可以自由提供资源。
我在 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)
这次会同时执行,因为不需要计算,系统可以自由提供资源。