是否可以使用 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
直到完全的。
是一个相关的例子。
我使用 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
直到完全的。