1
我寫一個多線程的Web服務器,基本上我需要跨多個線程的用戶提供的處理程序對象的Vec<Handler>
複製服務器上啓動。我嘗試幾種方法:如何在線程之間共享處理程序?
1)定義處理程序爲具有fn process(&mut self, Request) -> Response
方法的性狀。用戶將爲每個處理程序結構實現它。這種方法在C++或python等語言中很常見。問題是生鏽不允許我複製或克隆特質對象,因爲它暗示了禁止在特質對象上綁定的特徵對象Sized
。
2)定義處理程序作爲Box<FnMut(Request) -> Response>
。這不起作用,因爲關閉不可複製。
3)我可以線程之間共享同一個對象,但這種讓人很沒有意義我,因爲我需要一個互斥體,其將引入的時候我其實只需要在線程單獨副本無用的爭論。
我怎樣才能正確地實現這一點?
感謝您的建議。不幸的是,它似乎不適用於線程。給定的線程擁有Box,但不包含Handler,這意味着Handler需要實現Send。 Rust無法弄清楚Handler對象在線程之外沒有引用。這迫使我使Handler線程安全。 –
ElefEnt
複製和線程安全是不同的問題,事實上,如果你希望通過線程發送處理程序,你需要添加綁定到Handler的'Send'(也可能是靜態綁定),或者你可以添加它們到Box中,如Box'。爲了方便,我會推薦前者。 –
命名該方法'克隆'可能會造成混淆。 – mcarton