【问题标题】:PyQT Quamash loop and open_connection 'ValueError: loop argument must agree with Future'PyQT Quamash 循环和 open_connection 'ValueError:循环参数必须与 Future 一致'
【发布时间】:2018-06-28 17:53:09
【问题描述】:

我在 pyqt 上使用 quamash 循环(异步)和其他模块来异步连接到 RethinkDB。如果我不使用 quamash,RethinkDb 模块会以完美的方式连接。但是当使用 quamash 循环时,尽管将它放在每个关键参数循环上,它都会像这样失败:

  File "/home/dpineda/.virtualenvs/dragoncharts/lib/python3.6/site-packages/rethinkdb/asyncio_net/net_asyncio.py", line 148, in connect
    loop=self._io_loop)
  File "/usr/local/lib/python3.6/asyncio/streams.py", line 76, in open_connection
    lambda: protocol, host, port, **kwds)
  File "/usr/local/lib/python3.6/asyncio/base_events.py", line 731, in create_connection
    yield from tasks.wait(fs, loop=self)
  File "/usr/local/lib/python3.6/asyncio/tasks.py", line 311, in wait
    fs = {ensure_future(f, loop=loop) for f in set(fs)}
  File "/usr/local/lib/python3.6/asyncio/tasks.py", line 311, in <setcomp>
    fs = {ensure_future(f, loop=loop) for f in set(fs)}
  File "/usr/local/lib/python3.6/asyncio/tasks.py", line 514, in ensure_future
    raise ValueError('loop argument must agree with Future')
ValueError: loop argument must agree with Future

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/local/lib/python3.6/asyncio/events.py", line 127, in _run
    self._callback(*self._args)
  File "/home/dpineda/Proyectos/TaskTools/tasktools/taskloop.py", line 40, in renew_quamash
    raise task.result()
  File "/home/dpineda/Proyectos/TaskTools/tasktools/taskloop.py", line 11, in coromask
    obtained=await coro(*args)
  File "/home/dpineda/Proyectos/DragonCharts/dragoncharts/qtgui/interface.py", line 382, in updates
    await self.read_stations_queue()
  File "/home/dpineda/Proyectos/DragonCharts/dragoncharts/qtgui/interface.py", line 257, in read_stations_queue
    conn=await self.connect_rethinkdb()
  File "/home/dpineda/Proyectos/DragonCharts/dragoncharts/qtgui/interface.py", line 315, in connect_rethinkdb
    conn=await r.async_connect()
  File "/home/dpineda/Proyectos/NetworkTools/networktools/dbs/rethinkdb.py", line 43, in async_connect
    **kwargs)
  File "/home/dpineda/.virtualenvs/dragoncharts/lib/python3.6/site-packages/rethinkdb/asyncio_net/net_asyncio.py", line 293, in reconnect
    return (yield from self._instance.connect(timeout))
  File "/home/dpineda/.virtualenvs/dragoncharts/lib/python3.6/site-packages/rethinkdb/asyncio_net/net_asyncio.py", line 156, in connect
    (self._parent.host, self._parent.port, str(err)))
rethinkdb.errors.ReqlDriverError: Could not connect to atlas.csn.uchile.cl:28015. Error: loop argument must agree with Future

所以,到目前为止,我认为我的技能是控制它的极限,因为这是 quamash 和 asyncio 库之间的兼容性问题!

或者,有什么解决办法?

谢谢!

【问题讨论】:

    标签: asynchronous pyqt5 rethinkdb python-asyncio


    【解决方案1】:

    确保将 quamash 循环设置为默认全局循环:

    from quamash import QEventLoop
    
    loop = QEventLoop(app)
    asyncio.set_event_loop(loop)
    

    单靠它很有可能会有所帮助。

    但如果没有,请将 sn-p 放在脚本的顶部,使其在任何异步模块导入之前执行。

    更新:

    没有检查它是否有效,但您可以尝试使用dependency injection through multiple inheritance 来获取具有两个事件循环属性的类:

    import asyncio
    from quamash import QEventLoop
    
    AEventLoop = type(asyncio.get_event_loop())
    
    
    class QEventLoopPlus(QEventLoop, AEventLoop):
        pass
    
    
    loop = QEventLoopPlus(app)
    asyncio.set_event_loop(loop)
    

    【讨论】:

    • 是的,我确实这样做了。问题是,最后,QEventLoop quamash 还没有实现 create_connection 方法,如 asyncio 源代码中显示的 AbstracLoop。所以,我想我必须在 quamash 循环上实现一个 hinherited 类:(
    • @DavidPinedaOsorio 我更新了答案,可能会有所帮助。
    • 酷!也许这行得通,它看起来像那样。我还阅读了有关信号槽的信息,它与我需要的功能相似
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-25
    • 1970-01-01
    • 1970-01-01
    • 2021-11-26
    • 1970-01-01
    • 2018-08-02
    • 2019-09-26
    相关资源
    最近更新 更多