我使用threading
模块打开了多个sqlloader
会话,但它运行正常。
使用asyncio
模块(协同程序)实现相同程度的并行性有麻烦。
此代码始终在Python 3.5中按顺序加载:
import asyncio
async def load_data(filename):
loadConf=('sqlldr SKIP=%s %s userid=%s DATA=%s control=%s LOG=%s.log BAD=%s.bad DISCARD=/dev/null' % (...)).split(' ')
p = Popen(loadConf, stdin=PIPE, stdout=PIPE, stderr=STDOUT, shell=False, env=os.environ)
output, err = p.communicate(pwd.encode())
status=p.wait()
async def main():
await asyncio.wait([load_data(file1),load_data(file2)])
if __name__ == "__main__":
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
答案 0 :(得分:1)
是的,但是你必须使用asyncio.create_subprocess_shell而不是subprocess.Popen
,因为后者对事件循环一无所知,只是在load_data
内阻塞,直到<NewPing>
为止。完成。
Here是一个相关的例子。