python的并发异步问题

python的并发异步问题,python,concurrency,python-asyncio,Python,Concurrency,Python Asyncio,我是python新手,我正在尝试解决一个简单的问题: 我有两个操作块(块A和块B),每个块执行不同的shell命令,这些命令应该在块内异步执行(在同一块中,我可以执行一个新操作,而不必等待第一个操作的结果) 只有在“块A”的所有操作完成后,我才能开始运行“块B”的操作 import asyncio import subprocess import sys import threading async def run_command(number, timeSleep): cmd =

我是python新手,我正在尝试解决一个简单的问题: 我有两个操作块(块A和块B),每个块执行不同的shell命令,这些命令应该在块内异步执行(在同一块中,我可以执行一个新操作,而不必等待第一个操作的结果)

只有在“块A”的所有操作完成后,我才能开始运行“块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
我希望在A区的操作完成后开始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

您必须使用
asyncio
模块来创建子流程,而不是直接使用
子流程
模块。
从:

导入异步IO
异步def运行(cmd):
proc=wait asyncio.create_subprocess_shell(
cmd,
stdout=asyncio.subprocess.PIPE,
stderr=asyncio.subprocess.PIPE)
stdout,stderr=await proc.communicate()
打印(f'[{cmd!r}与{proc.returncode}]一起退出)
如果标准输出:
打印(f'[stdout]\n{stdout.decode()}')
如果标准:
打印(f'[stderr]\n{stderr.decode()}')
asyncio.run(run('ls/zzz'))

您必须使用
异步IO
模块来创建子流程,而不是直接使用
子流程
模块。
从:

导入异步IO
异步def运行(cmd):
proc=wait asyncio.create_subprocess_shell(
cmd,
stdout=asyncio.subprocess.PIPE,
stderr=asyncio.subprocess.PIPE)
stdout,stderr=await proc.communicate()
打印(f'[{cmd!r}与{proc.returncode}]一起退出)
如果标准输出:
打印(f'[stdout]\n{stdout.decode()}')
如果标准:
打印(f'[stderr]\n{stderr.decode()}')
asyncio.run(run('ls/zzz'))