【发布时间】:2020-04-09 19:29:23
【问题描述】:
我是 python 新手,我试图解决一个简单的问题: 我有两个操作块(块 A 和块 B),每个块执行不同的 shell 命令,这些命令应该在块内异步执行(在同一个块中我可以执行一个新操作,而不必等待第一个操作的结果)。
只有在“Block A”的所有操作都完成后,我才能开始运行“Block B”的操作。
import asyncio
import subprocess
import sys
import threading
async def run_command(number, timeSleep):
cmd = "(echo '"+ number +" Start -->' $(date) ;sleep "+timeSleep +" ;echo '"+ number +" End -->' $(date) ) >> /tmp/log.txt"
p = subprocess.Popen(cmd, stderr=subprocess.PIPE, shell=True)
async def block_a():
await asyncio.gather(
run_command("Block A: Operation 1","8"),
run_command("Block A: Operation 2","4"),
run_command("Block A: Operation 3","2"))
async def block_b():
await asyncio.gather(
run_command("Block B Operation 1","5"),
run_command("Block B Operation 2","4"),
run_command("Block B Operation 3","1"))
async def main():
await asyncio.gather(
block_a(),
block_b())
if __name__ == '__main__':
# Create the asyncio event loop
loop = asyncio.get_event_loop()
try:
loop.run_until_complete(main())
finally:
# Shutdown the loop even if there is an exception
loop.close()
我得到以下输出:
Block A: Operation 2 Start --> Thu Apr 9 21:21:27 CEST 2020
Block A: Operation 3 Start --> Thu Apr 9 21:21:27 CEST 2020
Block A: Operation 1 Start --> Thu Apr 9 21:21:27 CEST 2020
Block B Operation 1 Start --> Thu Apr 9 21:21:27 CEST 2020
Block B Operation 2 Start --> Thu Apr 9 21:21:27 CEST 2020
Block B Operation 3 Start --> Thu Apr 9 21:21:27 CEST 2020
Block B Operation 3 End --> Thu Apr 9 21:21:28 CEST 2020
Block A: Operation 3 End --> Thu Apr 9 21:21:29 CEST 2020
Block A: Operation 2 End --> Thu Apr 9 21:21:31 CEST 2020
Block B Operation 2 End --> Thu Apr 9 21:21:31 CEST 2020
Block B Operation 1 End --> Thu Apr 9 21:21:32 CEST 2020
Block A: Operation 1 End --> Thu Apr 9 21:21:35 CEST 2020
我希望在 Block A 的操作完成后开始 Block B 的操作。
我期待的输出是这样的:
Block A: Operation 2 Start --> Thu Apr 9 21:21:27 CEST 2020
Block A: Operation 3 Start --> Thu Apr 9 21:21:27 CEST 2020
Block A: Operation 1 Start --> Thu Apr 9 21:21:27 CEST 2020
Block A: Operation 3 End --> Thu Apr 9 21:21:29 CEST 2020
Block A: Operation 2 End --> Thu Apr 9 21:21:31 CEST 2020
Block A: Operation 1 End --> Thu Apr 9 21:21:35 CEST 2020
Block B Operation 1 Start --> Thu Apr 9 21:21:27 CEST 2020
Block B Operation 2 Start --> Thu Apr 9 21:21:27 CEST 2020
Block B Operation 3 Start --> Thu Apr 9 21:21:27 CEST 2020
Block B Operation 3 End --> Thu Apr 9 21:21:28 CEST 2020
Block B Operation 2 End --> Thu Apr 9 21:21:31 CEST 2020
Block B Operation 1 End --> Thu Apr 9 21:21:32 CEST 2020
【问题讨论】:
标签: python concurrency python-asyncio