是否可以使用 Python/co-routines 并行加载到 Oracle?

Is it possible to parallelize load to Oracle using Python/co-routines?

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

是的,这是可能的,但是你必须使用 asyncio.create_subprocess_shell 而不是 subprocess.Popen,因为后者对事件循环一无所知,只会阻塞你的 load_data 直到完全的。 是一个相关的例子。