是否可以使用Python /协同例程并行加载到Oracle?

时间:2016-11-29 16:57:11

标签: python oracle coroutine

我使用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())   

1 个答案:

答案 0 :(得分:1)

是的,但是你必须使用asyncio.create_subprocess_shell而不是subprocess.Popen,因为后者对事件循环一无所知,只是在load_data内阻塞,直到<NewPing>为止。完成。 Here是一个相关的例子。