私はpythonを使用して、ベンダーが提供するpython APIを使用してハードウェアusbスニファーデバイスをインターフェースしており、無限ループの別のスレッドでデバイスから(usbパケット)を読み取ろうとしています(これは正常に動作します)。問題は、私のメイン ループが再びスケジュールされないように見えることです (私の読み取りループがすべての注目を集めます)。
コードは次のようになります。
from threading import Thread
import time
usb_device = 0
def usb_dump(usb_device):
while True:
#time.sleep(0.001)
packet = ReadUSBDevice(usb_device)
print "packet pid: %s" % packet.pid
class DumpThread(Thread):
def run(self):
usb_dump()
usb_device = OpenUSBDevice()
t = DumpThread()
t.start()
print "Sleep 1"
time.sleep(1)
print "End"
CloseUSBDevice(usb_device)
sys.exit(0)
(実際のコードを貼り付けることもできますが、ハードウェア デバイスが必要なので、あまり役に立たないと思います)。
メインスレッドがプログラム全体を終了する前に、このコードが約 1 秒間 USB パケットのダンプを開始することを期待しています。ただし、表示されるのは「Sleep 1」だけで、usb_dump()
手順は永久に実行されます。プロシージャの内部ループで「time.sleep(0.001)」ステートメントのコメントを外すと、usb_dump()
期待どおりに動作し始めますが、Python コードは入ってくるすべてのパケットに追いつくことができなくなります :-(
ベンダーは、これは Python スケジューラの問題であり、API のせいではないため、役に立たないと言います。
«しかし、Python でスレッド化を使用する場合、いくつかのニュアンスが発生しているようです。DumpThread スレッドに time.sleep を配置することで、制御を放棄するように Python スレッド システムに明示的に信号を送ることになります。それ以外の場合、いつスレッドを切り替えるかを決定するのは Python インタープリターであり、通常は一定数のバイトコード命令が実行された後にそれを行います。»
ここでpythonが問題であることを誰かが確認できますか? DumpThread リリース コントロールを作成する別の方法はありますか? 他のアイデアはありますか?