【发布时间】:2021-05-27 00:24:07
【问题描述】:
我有以下代码,用于测试目的。
这只是一个调用“5000x factorial(900)”并打印输出的函数
我使用线程还是异步都没关系,它们总是在另一个函数之后运行一个函数,从不并行。
第一个使用 asyncio:
import asyncio
async def factorial(name, number):
def fatorial(n):
if n == 1:
return 1
else:
return n * fatorial(n - 1)
print(f"START: Task {name}: factorial({number})")
for i in range(5000):
var = fatorial(number)
print(f"FIM: Task {name}: factorial({number})")
return var
async def main():
task1 = asyncio.ensure_future(factorial("A", 900))
task2 = asyncio.ensure_future(factorial("B", 900))
task3 = asyncio.ensure_future(factorial("C", 900))
task4 = asyncio.ensure_future(factorial("D", 900))
await asyncio.gather(task1, task2, task3, task4)
asyncio.run(main())
也试过了:
async def main():
# Schedule three calls *concurrently*:
task1 = asyncio.create_task(factorial("A", 900))
task2 = asyncio.create_task(factorial("B", 900))
task3 = asyncio.create_task(factorial("C", 900))
task4 = asyncio.create_task(factorial("D", 900))
await task4
asyncio.run(main())
还尝试了线程:
import threading
def factorial(name, number):
def fatorial(n):
if n == 1:
return 1
else:
return n * fatorial(n - 1)
print(f"START: Task {name}: factorial({number})")
for i in range(5000):
var = fatorial(number)
print(f"FIM: Task {name}: factorial({number})")
threading.Thread(target=factorial("A", 900), daemon=True).start()
threading.Thread(target=factorial("B", 900), daemon=True).start()
threading.Thread(target=factorial("C", 900), daemon=True).start()
threading.Thread(target=factorial("D", 900), daemon=True).start()
而且输出总是一样的:
START: Task A: factorial(900)
FIM: Task A: factorial(900)
START: Task B: factorial(900)
FIM: Task B: factorial(900)
START: Task C: factorial(900)
FIM: Task C: factorial(900)
START: Task D: factorial(900)
FIM: Task D: factorial(900)
【问题讨论】:
-
异步和线程都不适合 CPU 密集型工作。你最好使用 multiprocessing 或 concurrent.futures.ProcessorPoolExecutor。
-
谢谢@dirn,但遗憾的是它也没有用。我尝试了这两个选项,总是相同的结果
标签: python python-3.x python-asyncio python-multithreading