我有一段需要执行时间很长且需要大量CPU资源的代码块。我想要运行这个代码块多次,并充分利用我的CPU资源。通过查看
下面的示例中,
当我将
是否有一种方法可以使用这种方法并行执行我的代码,或者应该使用
asyncio
,我了解到它主要用于异步通讯,但也是用于异步任务的通用工具。下面的示例中,
time.sleep(y)
是我想要运行的代码的占位符。在此示例中,每个协程依次执行,整个执行过程大约需要8秒钟。import asyncio
import logging
import time
async def _do_compute_intense_stuff(x, y, logger):
logger.info('Getting it started...')
for i in range(x):
time.sleep(y)
logger.info('Almost done')
return x * y
logging.basicConfig(format='[%(name)s, %(levelname)s]: %(message)s', level='INFO')
logger = logging.getLogger(__name__)
loop = asyncio.get_event_loop()
co_routines = [
asyncio.ensure_future(_do_compute_intense_stuff(2, 1, logger.getChild(str(i)))) for i in range(4)]
logger.info('Made the co-routines')
responses = loop.run_until_complete(asyncio.gather(*co_routines))
logger.info('Loop is done')
print(responses)
当我将
time.sleep(y)
替换为asyncio.sleep(y)
时,它几乎立即返回结果。而使用await asyncio.sleep(y)
则需要大约2秒钟。是否有一种方法可以使用这种方法并行执行我的代码,或者应该使用
multiprocessing
或threading
?我需要将time.sleep(y)
放入线程中吗?
await
是一个地方,让您的任务告诉事件循环,如果其他任务没有在等待,则它愿意运行。time.sleep()
则正好相反。它会阻止一切,因此事件循环无法切换任务。 - Martijn Pietersasyncio.sleep()
会生成一个协程。如果你不在它上面使用 await,它将不会执行任何操作,因此是的,你会立即看到返回结果。 - Martijn Pieters