在我最近的一個項目,我碰巧在同一個進程有(Python程序,其多線程應用程序):Python在Linux中選擇和處理EINTR的任何解決方法?
一個boost :: Python模塊到對AVT PvAPI SDK鏈接庫,即在最廣泛的意義上來說是一個驅動程序來獲取相機的圖像幀。這個庫(PvApi SDK)每幾毫秒產生一個SIGALRM。
另一個普通的Python模塊,打算使用pyserial來做一些串行I/O。這反過來使用Python的包裝select.select POSIX select。每當信號由其他模塊產生時,結果中斷(
errno == EINTR
)。在任何Python的調用time.sleep中都可以看到同樣的問題,內部使用的POSIX sleep。
這些問題在Windows中顯然不存在,因爲睡眠和選擇不會被任何信號中斷(根據文檔)。而這些問題在C/C++中並不是什麼大問題,因爲你可以(也應該)在它們被中斷時重新啓動這些調用。但是,由於Python實現(source code /Modules/selectmodule.c)不處理這種情況(EINTR
),我是否被迫實現了自己的C/C++串行驅動程序和睡眠函數以在Python中使用?或者爲了這個項目離開Python?由於Python使編程變得如此簡單,我非常感興趣,如果任何人有類似的問題,並找到一個很好的解決方法或簡單的修復。目前,我沒有能力自己爲Python模塊制定必要的修復。或者,也許我錯過了其他一些選擇?
任何想法?
根據[manpage](http://www.kernel.org/doc/man-pages/online/pages/man7/signal.7.html)自動重新啓動'select'和'sleep'(和一些其他調用)不可能用於'signal.siginterrupt',禁用信號也不行。可能是因爲它是一個多線程應用程序。 – moooeeeep