使 pandas 函数异步
Making a pandas function asynchronous
考虑以下代码段。
import asyncio
import pandas as pd
# @asyncio.coroutine
async def read(some_id):
'''
'''
# await ?, yield ?, yield from ?
return pd.read_sql_query(f'''SELECT * FROM some_table WHERE id={some_id}''',
con) # how do I make this line awaitable.
我希望能够实现该功能 awaitable 以便我可以在数组中传递 id 并同时开始查询,因为读取 table 需要很多时间,比如.
async def main():
'''
'''
alltasks = []
for some_id in [3, 2, 5]:
task = asyncio.create_task(read(some_id))
alltasks.append(task)
res = await asyncio.gather(*alltasks)
现在这会同步执行查询,因为我的函数不是真正的异步,那么如何让它真正异步。
我知道我可以使用 asycio.sleep(0) 但这不会执行查询,我如何在不使用 concurrent.future.ThreadPoolExecutor 的情况下实现这一点,就像在其他答案中一样。
感谢您的帮助,谢谢。
您可以通过 asyncio.to_thread()
:
将任何常规函数转换为可等待的协程
def read(some_id): # note: no await!
return pd.read_sql_query(...)
async def main():
tasks = [asyncio.to_thread(read, some_id) for some_id in [3, 2, 5]]
res = await asyncio.gather(*tasks)
asyncio.run(main())
考虑以下代码段。
import asyncio
import pandas as pd
# @asyncio.coroutine
async def read(some_id):
'''
'''
# await ?, yield ?, yield from ?
return pd.read_sql_query(f'''SELECT * FROM some_table WHERE id={some_id}''',
con) # how do I make this line awaitable.
我希望能够实现该功能 awaitable 以便我可以在数组中传递 id 并同时开始查询,因为读取 table 需要很多时间,比如.
async def main():
'''
'''
alltasks = []
for some_id in [3, 2, 5]:
task = asyncio.create_task(read(some_id))
alltasks.append(task)
res = await asyncio.gather(*alltasks)
现在这会同步执行查询,因为我的函数不是真正的异步,那么如何让它真正异步。 我知道我可以使用 asycio.sleep(0) 但这不会执行查询,我如何在不使用 concurrent.future.ThreadPoolExecutor 的情况下实现这一点,就像在其他答案中一样。
感谢您的帮助,谢谢。
您可以通过 asyncio.to_thread()
:
def read(some_id): # note: no await!
return pd.read_sql_query(...)
async def main():
tasks = [asyncio.to_thread(read, some_id) for some_id in [3, 2, 5]]
res = await asyncio.gather(*tasks)
asyncio.run(main())