Python异步调用Gremlin(使用async)

1、需要设置transport_factory

2、需要调用new_event_loop、get_running_loop以及set_event_loop函数

3、需要设置线程池pool,防止并发量过大导致访问数据库异常

import asyncio
import functools
from gremlin_python.driver.aiohttp.transport import AiohttpTransport
from gremlin_python.process.anonymous_traversal import traversal
from gremlin_python.driver.driver_remote_connection import DriverRemoteConnection
from gremlin_python.driver import client
from concurrent.futures import ThreadPoolExecutor

pool = ThreadPoolExecutor(max_workers=100)

def run1(g, loop):
    asyncio.set_event_loop(loop)
    return g.V().limit(3).toList()

def run2(g, loop):
    asyncio.set_event_loop(loop)
    return g.V().limit(2).toList()

async def run(g):
    loop = asyncio.get_running_loop()
    r1 = loop.run_in_executor(pool, functools.partial(run1, g, loop))
    r2 = loop.run_in_executor(pool, functools.partial(run2, g, loop))
    return {'run1': await r1, 'run2': await r2}

if __name__ == '__main__':
    client = client.Client('ws://localhost:8182/gremlin', None, username='user', password='pass')
    result_set = client.submit('GridGraphFactory.openGraph("db");g=graph.traversal();return;')
    connection = DriverRemoteConnection('ws://localhost:8182/gremlin', 'gdb',
                                        username='user', password='pass',
                                        transport_factory=lambda: AiohttpTransport(call_from_event_loop=True))
    g = traversal().withRemote(connection)
    loop = asyncio.new_event_loop()
    res = loop.run_until_complete(run(g))
    loop.close()
    print(res)
    client.close()
    connection.close()

posted on 2024-07-30 10:10  sw-lab  阅读(10)  评论(0)    收藏  举报  来源

导航