擅长:python、mysql、java
<p>您的实现存在一些问题:</p>
<ol>
<li><p>你的“主”文件调用测试.py每秒调用一次,但是测试.py前后等待5秒。我不记得python系统调用是否阻塞了调用者,所以a)如果它没有阻塞,那么测试.py在它仍在等待获取after时被再次调用,或者b)如果它确实阻塞了,那么“main”中会有一秒钟的延迟,在那里永远看不到更改。修正:下面的2通过没有单独的程序来解决这个问题。</p></li>
<li><p>因为测试.py确定之前,等待5秒,然后确定之后,然后退出,usb驱动器更改可能会在退出和启动之间发生,并且不会报告为更改测试.py. 你需要测试.py从不退出-它应该在开始时设置为before,然后每隔5秒检查一次,如果after不同,则使用after的新值更新before,然后返回等待5秒。修复:测试.py不应该退出-它应该是“main”,或者永远在线程中运行。</p></li>
<li><p>如果设备在确定“前”之后插入,然后在确定“之前”之前将其移除,即在最多5秒钟内,此情况不会由报告测试.py. 修正:可能不重要,如果使用轮询,那么您必须延迟一些检查间隔时间。唯一真正的解决方案是不使用轮询,而是将驱动器更改的事件通知挂接到操作系统中,这也是最健壮的实现。。。</p></li>
</ol>
<p>无论如何,假设轮询是您的代码的最佳解决方案测试.py应该看起来像这样(注意测试.py永远不要退出,否则可能会错过变化):</p>
<pre><code> before = set(get_drives())
while true:
time.sleep(5)
after = set(get_drives())
drives = after - before
delta = len(drives)
if (delta):
# ...process delta
...
# finally, after becomes the new before WITHOUT re-reading the drives, that will happen again in five seconds...
before = after
</code></pre>