【问题标题】:hid.find_all_hid_devices() in asyncio coroutine异步协程中的 hid.find_all_hid_devices()
【发布时间】:2015-08-16 22:14:35
【问题描述】:

为了访问连接在我的计算机上的 USB HID 设备,我使用了 pywinusb 包中的函数 find_all_hid_devices()

现在我想从异步协程访问这个 HID 设备。用下面的代码

@asyncio.coroutine
def main():
    from pywinusb import hid
    a = hid.find_all_hid_devices()

返回如下错误:

Traceback (most recent call last):
  File "C:\Python34\lib\site-packages\pywinusb\hid\core.py", line 122, in find_all_hid_devices
    for interface_data in winapi.enum_device_interfaces(h_info, guid):
  File "C:\Python34\lib\site-packages\pywinusb\hid\winapi.py", line 466, in enum_device_interfaces
    byref(dev_interface_data) ):
ctypes.ArgumentError: argument 1: <class 'OverflowError'>: int too long to convert

hid.find_all_hid_devices() 的相同调用却可以在没有 asyncio 的普通 main 中独立工作。

这是因为我试图在协程中访问吗?实现这一目标的正确方法是什么?

【问题讨论】:

    标签: python python-3.x python-asyncio pywinusb


    【解决方案1】:

    pywinusb 库在设计上是同步的,因此您应该在线程池中调用它。

    @asyncio.coroutine
    def f():
        loop = asyncio.get_event_loop()
        a = yield from loop.run_in_executor(None, hid.find_all_hid_devices)
    

    从技术上讲允许来自协程的同步调用,但不鼓励,因为它会长时间暂停事件循环。

    【讨论】:

    • 太棒了,谢谢你的回答!一旦我得到我的 HID 设备,我必须在其上运行的代码也是(不幸的是)同步的(例如device.dosomething1device.dosomething2)。您是否会建议我将所有这些指令也包装在一个线程池中,尽管不鼓励?
    • 要干净:将同步调用传递到线程池中是完全可以的,该池旨在用于此用途。从 asyncio 的角度来看,将同步调用推送到 executor 会将其转换为异步调用。所以是的,请保持这种方式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 2021-09-09
    • 2019-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多