【发布时间】:2020-03-04 18:53:11
【问题描述】:
目标
使用asyncio,异步运行bcp 实用程序将多个表提取到.dat 文件。独立运行的命令会产生预期的结果。通过subprocess.run 进行顺序执行时,命令也成功执行。相信错误是由于我使用或不使用await的方式造成的。
错误
Traceback (most recent call last):
File "bcp_out_all.py", line 38, in <module>
asyncio.run(windows_loop([cmd_ for cmd_ in bcp_cmds]))
File "C:\Users\hSin\AppData\Local\Continuum\anaconda3\envs\ELT\lib\asyncio\runners.py", line 43, in run
return loop.run_until_complete(main)
File "C:\Users\hSin\AppData\Local\Continuum\anaconda3\envs\ELT\lib\asyncio\base_events.py", line 583, in run_until_complete
return future.result()
File "bcp_out_all.py", line 14, in windows_loop
loop.run_until_complete(parallel_bcp(cmd_))
File "C:\Users\hSin\AppData\Local\Continuum\anaconda3\envs\ELT\lib\asyncio\base_events.py", line 570, in run_until_complete
self.run_forever()
File "C:\Users\hSin\AppData\Local\Continuum\anaconda3\envs\ELT\lib\asyncio\base_events.py", line 528, in run_forever
'Cannot run the event loop while another loop is running')
RuntimeError: Cannot run the event loop while another loop is running
sys:1: RuntimeWarning: coroutine 'parallel_bcp' was never awaited
脚本
#bcp_out_all.py
import asyncio
#commands successfully run in PowerShell terminal
bcp_cmds = [['bcp db.schema.tbl_1 OUT tbl_1.dat -e tbl_1_error.dat -T -n -t"|" -S SRVRNAME'], ['bcp db.schema.tbl_2 OUT tbl_2.dat -e tbl_2_error.dat -T -n -t"|" -S SRVRNAME']]
async def parallel_bcp(cmd_):
process = await asyncio.create_subprocess_exec(cmd_, stdout=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.PIPE)
await process.wait()
async def windows_loop(cmd_):
loop = asyncio.ProactorEventLoop()
asyncio.set_event_loop(loop)
loop.run_until_complete(parallel_bcp(cmd_))
asyncio.run(windows_loop([cmd_ for cmd_ in bcp_cmds]))
【问题讨论】:
-
您不需要在诸如
windows_loop之类的异步函数中使用run_until_complete- 您只需await parallel_bcp(cmd_)。或者,由于您的cmd_实际上是一个列表,您应该使用类似await asyncio.gather(*[parallel_bcp(c) for c in cmd_])
标签: python sql-server subprocess python-asyncio bcp