You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tinkerpop.apache.org by "Stephen Mallette (Jira)" <ji...@apache.org> on 2022/06/15 20:37:00 UTC
[jira] [Commented] (TINKERPOP-2752) `AiohttpTransport` malfunctions in an eventlet monkey patched app
[ https://issues.apache.org/jira/browse/TINKERPOP-2752?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17554784#comment-17554784 ]
Stephen Mallette commented on TINKERPOP-2752:
---------------------------------------------
Can't you supply your own custom transport now with the {{transport_factory}} argument to the {{Client}}? Or were you asking if would we accept another implementation of {{AbstractBaseTransport}} as part of a PR so that folks had another option?
> `AiohttpTransport` malfunctions in an eventlet monkey patched app
> -----------------------------------------------------------------
>
> Key: TINKERPOP-2752
> URL: https://issues.apache.org/jira/browse/TINKERPOP-2752
> Project: TinkerPop
> Issue Type: Bug
> Components: python
> Affects Versions: 3.6.0, 3.5.2
> Environment: python 3.8, running both natively on macOS, and within a Docker container hosted on macOS
> Reporter: Steve Kieffer
> Priority: Blocker
>
> I'm running an eventlet-based Flask web app, that starts out with a call to
> {code:python}
> eventlet.monkey_patch()
> {code}
> and has view functions that use gremlin-python to connect to a gremlin server.
> I've found that if the browser issues several requests in rapid succession, it can provoke the
> {code:python}
> RuntimeError: Cannot run the event loop while another loop is running
> {code}
> error. Passing
> {code:python}
> call_from_event_loop=True
> {code}
> when constructing the {{DriverRemoteConnection}} just leads to a different type of error, because the problem is transient, not consistent.
> I've developed a minimal example that demonstrates the issue, and can share a link to that if it would be helpful.
> *Possible solution:*
> How about supplying another transport, besides the {{AiohttpTransport}} class, which uses the {{websocket-client}} python package, instead of {{aiohttp}}?
> I've made one which is very rudimentary but, in testing so far, works fine and solves this issue:
> {code:python}
> from gremlin_python.driver.transport import AbstractBaseTransport
> import websocket
> class WebsocketTransport(AbstractBaseTransport):
> def __init__(self, **kwargs):
> self.ws = websocket.WebSocket(**kwargs)
> def connect(self, url, headers=None):
> headers = headers or []
> self.ws.connect(url, header=headers)
> def write(self, message):
> self.ws.send_binary(message)
> def read(self):
> return self.ws.recv()
> def close(self):
> self.ws.close()
> @property
> def closed(self):
> return not self.ws.connected
> def transport_factory():
> return WebsocketTransport()
> {code}
> Happy to open this as a PR, if it seems like a good idea.
--
This message was sent by Atlassian Jira
(v8.20.7#820007)