小编Nab*_*nde的帖子

如何使用asyncio优雅地超时

所以在添加try/catch块之前,当进程运行不到5分钟时,我的事件循环正常关闭,但是在添加try/catch块后,当进程超过5分钟时我开始收到此错误

async def run_check(shell_command):
    p = await asyncio.create_subprocess_shell(shell_command,
                    stdin=PIPE, stdout=PIPE, stderr=STDOUT)
    fut = p.communicate()
    try:
        pcap_run = await asyncio.wait_for(fut, timeout=5)
    except asyncio.TimeoutError:
        pass

def get_coros():
    for pcap_loc in print_dir_cointent():
        for pcap_check in get_pcap_executables():
            tmp_coro = (run_check('{args}'
            .format(e=sys.executable, args=args)))
            if tmp_coro != False:
                coros.append(tmp_coro)
     return coros

async def main(self):
    p_coros = get_coros()
    for f in asyncio.as_completed(p_coros):
        res = await f




loop = asyncio.get_event_loop()
loop.run_until_complete(get_coros())
loop.close()
Run Code Online (Sandbox Code Playgroud)

追溯:

Exception ignored in: <bound method BaseSubprocessTransport.__del__ of 
    <_UnixSubprocessTransport closed pid=171106 running stdin=
    <_UnixWritePipeTransport closing fd=8 …
Run Code Online (Sandbox Code Playgroud)

runtime-error timeoutexception python-3.x async-await python-asyncio

7
推荐指数
1
解决办法
7086
查看次数

ASYNCIO:[错误]任务已被破坏,但尚待处理

async def run_check(shell_command):
    p = await asyncio.create_subprocess_shell(shell_command,
                    stdin=PIPE, stdout=PIPE, stderr=STDOUT)
    fut = p.communicate()
    try:
        pcap_run = await asyncio.wait_for(fut, timeout=5)
    except asyncio.TimeoutError:
        p.kill()
        await p.communicate()

def get_coros(pcap_list):
    for pcap_loc in pcap_list:
        for pcap_check in get_pcap_executables():
            tmp_coro = (run_check('{args}'
            .format(e=sys.executable, args=args)))
            if tmp_coro != False:
                coros.append(tmp_coro)
     return coros

async def main():
    pcap_list_gen = print_dir_cointent()
    for pcap_list in pcap_list_gen:
        p_coros = get_coros(pcap_list)
        for f in asyncio.as_completed(p_coros):
            res = await f

loop = asyncio.get_event_loop()
loop.run_until_complete(main())
loop.close()
Run Code Online (Sandbox Code Playgroud)

pcap_list_gen是包含多个列表的PCAP列表的生成器。如果将所有pcap传递到一个列表中,则会得到[OS:错误:到许多打开的文件],因此决定将它们分组为较小的列表,并一次处理一个。

每个pcap_list是多个PCAPS的列表。我希望循环的下一次迭代仅在第一次迭代完成后才开始。

for …
Run Code Online (Sandbox Code Playgroud)

python runtime-error event-loop async-await python-asyncio

5
推荐指数
1
解决办法
1776
查看次数