ps:程序结构都给你了!具体API不知道意思就去google吧!本人实际写过3和4两种形式的异步程序。
1、运行协程的两种方式
在异步编程中,通常会有一个主协程函数,负责协调和调度其他协程任务。在以前的版本中,通常使用
asyncio.get_event_loop().run_until_complete(main())
来运行主协程函数。这个方法在主协程函数执行完成后会自动关闭事件循环。
而在 Python 3.7 中引入了 asyncio.run()
方法,它是一个更简洁的替代方法,用于运行主协程函数。asyncio.run(main())
会自动创建一个新的事件循环,运行指定的主协程函数,然后在主协程函数执行完成后自动关闭事件循环。这样可以减少异步编程中的一些常见问题,如事件循环的泄漏等。
2、多进程+异步程序的一种结构:以asyncio.run()运行协程
主协程:main_coroutine
import asyncio
import multiprocessing
async def worker_coroutine():
# 协程任务的逻辑
pass
async def main_coroutine():
# 创建并发执行的协程任务列表
tasks = [worker_coroutine() for _ in range(5)]
# 并发执行协程任务
await asyncio.gather(*tasks)
def process_worker():
asyncio.run(main_coroutine())
if __name__ == "__main__":
# 创建多个子进程
processes = [multiprocessing.Process(target=process_worker) for _ in range(3)]
# 启动子进程
for process in processes:
process.start()
# 等待子进程结束
for process in processes:
process.join()
3、多进程+异步程序的一种结构:以run_until_complete运行协程
import asyncio
import multiprocessing
async def worker_coroutine():
# 协程任务的逻辑
pass
def process_worker():
# 在子进程中创建新的事件循环
loop = asyncio.new_event_loop()
# 将loop设置为当前事件循环
asyncio.set_event_loop(loop)
# 并发运行协程任务
tasks = [worker_coroutine() for _ in range(5)]
try:
loop.run_until_complete(asyncio.gather(*tasks))
finally:
loop.close()
if __name__ == "__main__":
# 创建多个子进程
processes = [multiprocessing.Process(target=process_worker) for _ in range(3)]
# 启动子进程
for process in processes:
process.start()
# 等待子进程结束
for process in processes:
process.join()
3.1 在子进程中可以用asyncio.get_event_loop()吗?
在多进程中,使用 asyncio.new_event_loop()
和 asyncio.set_event_loop()
的组合通常更安全,因为它确保在每个子进程中都有一个独立的事件循环。
使用 asyncio.get_event_loop()
会返回主进程中的事件循环,但在多进程环境中,主进程和子进程共享同一个事件循环,这可能会导致意外的行为和竞争条件。
因此,为了避免潜在的并发问题,最好在每个子进程中都创建一个新的事件循环,然后在其中运行协程任务。
4、单进程+异步程序的一种结构:以asyncio.run()运行协程
import asyncio
async def coroutine_task():
# 异步任务的逻辑
await asyncio.sleep(1)
print("Coroutine task completed")
async def main():
# 创建并发执行的异步任务列表
tasks = [coroutine_task() for _ in range(3)]
# 并发执行异步任务
await asyncio.gather(*tasks)
if __name__ == "__main__":
# 运行主事件循环
asyncio.run(main())
评论列表,共 0 条评论
暂无评论