擅长:python、mysql、java
<p>如果您的供应商是纯python</strong>代码,那么您的供应商是对的;但是,C扩展可能会释放<a href="http://effbot.org/pyfaq/what-is-the-global-interpreter-lock.htm" rel="nofollow noreferrer">GIL</a>,因此允许实际的多线程处理。在</p>
<p>尤其是,时间。睡觉<strong>是否</strong>发布了GIL(您可以直接从源代码中检查,<a href="http://svn.python.org/view/python/trunk/Modules/timemodule.c?view=markup" rel="nofollow noreferrer">here</a>-请看<code>floatsleep</code>实现),因此您的代码应该没有任何问题。
作为进一步的证明,我还做了一个简单的测试,只是去掉了对USB的调用,它实际上如预期的那样工作:</p>
<pre><code>from threading import Thread
import time
import sys
usb_device = 0
def usb_dump():
for i in range(100):
time.sleep(0.001)
print "dumping usb"
class DumpThread(Thread):
def run(self):
usb_dump()
t = DumpThread()
t.start()
print "Sleep 1"
time.sleep(1)
print "End"
sys.exit(0)
</code></pre>
<p>最后,对您发布的代码做几点说明:</p>
<ul>
<li>usb设备未传递到线程。您需要将其作为参数传递或(argh!)告诉线程从全局命名空间获取它。在</li>
<li>而不是强迫系统出口(),最好只发出停止线程的信号,然后关闭USB设备。我怀疑您的代码可能会遇到一些多线程问题,就像现在这样。在</li>
<li>如果你只需要定期投票,线程。计时器上课对你来说可能是个更好的解决办法。在</li>
</ul>
<p>[<em>Update</em>]关于最新的一点:如评论中所述,我认为<code>Timer</code>更适合您函数的语义(定期轮询),并自动避免GIL未由供应商代码发布的问题。在</p>