擅长:python、mysql、java
<p>我假设您编写了一个pythoncmodule,它公开ReadUSBDevice函数,它的目的是在接收到USB包之前阻塞它,然后返回它。在</p>
<p>本机ReadUSBDevice实现需要在等待USB包时释放pythongil,然后在接收到USB包时重新获取它。这允许在执行本机代码时运行其他Python线程。在</p>
<p><a href="http://docs.python.org/c-api/init.html#thread-state-and-the-global-interpreter-lock" rel="nofollow noreferrer">http://docs.python.org/c-api/init.html#thread-state-and-the-global-interpreter-lock</a></p>
<p>虽然您已经解锁了GIL,但您不能访问Python。释放GIL,运行blocking函数,然后当您知道有东西要返回Python时,重新获取它。在</p>
<p>如果您不这样做,那么当您的本机阻塞正在进行时,就没有其他Python线程可以执行。如果这是一个供应商提供的Python模块,那么在本机阻塞活动期间未能释放GIL是一个bug。在</p>
<p>请注意,如果您接收到许多包,并且实际使用Python处理它们,那么其他线程仍然应该运行。实际上运行Python代码的多个线程不会并行运行,但它会频繁地在线程之间切换,给它们提供运行的机会。如果本机代码在没有释放GIL的情况下阻塞,这就不起作用了。在</p>
<p>编辑:我看到你提到这是一个供应商提供的库。如果你没有source,一个快速查看他们是否正在释放GIL的方法:在没有USB活动的情况下启动ReadUSBDevice线程,所以ReadUSBDevice只是坐在那里等待数据。如果他们正在释放GIL,其他线程应该可以畅通无阻地运行。如果他们不这样做,整个口译员都会被挡住。那将是一个严重的错误。在</p>