15
我需要通過Rust程序中的posix filedescriptor讀取由外部進程提供的數據。 fd連接保持很長時間(小時),而另一端不時向我傳遞數據。所以我需要不斷讀取和處理數據流。如何處理Rust中的阻塞I/O或長時間運行的外部函數調用
爲此,我編寫了一個循環,調用libc::read()
(readv實際)來讀取數據並在收到時處理它。由於這會阻塞整個調度程序,因此我正在新調度程序中產生一項任務(task::spawn_sched(SingleThreaded)
)。只要運行它就可以正常工作,但我無法找到乾淨地關閉循環的方法。
由於循環阻塞了大部分時間,我不能使用端口/ chan來通知循環退出。
我試圖通過使用失敗的鏈接任務取消循環任務(產生監督的循環任務,在其中產生鏈接任務,並等待端口上的信號在fail!()
之前發生並取消循環任務)。它的工作原理以及在測試中,但libc::read()
不會被中斷(任務不讀完成之前失敗,並且在這一段時間內擊中task::yield()
。
我學到了很多東西看着libcore來源,但我似乎無法找到一個妥善的解決辦法。
- 有沒有辦法殺一個(孩子)拉斯特任務,即使它做一些長期的外部函數調用,比如阻塞讀?
- 有沒有辦法做非阻塞讀在一個posix文件描述符,以便Rust能夠控制任務?
- 我該如何對信號做出反應, G。 SIGTERM如果用戶終止我的程序。在Rust中似乎沒有像
sigaction()
這樣的東西?
目前似乎不可能這樣做,但正在努力改善異步I/O:https://github.com/mozilla/rust/issues/4419 – Zargony
是否有任何有關非阻塞I/O現在在Rust 1.0中? – jocull
這個評論稍後很多,但由於這個問題沒有一個可以接受的答案,所以我把它放在這裏:io的故事自1.0以來已經發生了很大的變化。目前非常重視使用mio的異步I/O,它基於Linux和Windows的內核庫(不能記住它們)。可能很快會出現一些語法級別的功能。更一般地說,如果一個工作線程有一個工作循環,這個循環可以檢查關閉消息。如果它在I/O上被阻塞,我不知道是否有可能將其喚醒。我有興趣瞭解更多。 – derekdreery