2009-02-20 80 views
4

我需要做一些網絡綁定調用(例如,獲取網站),我不希望它阻止用戶界面。如果我在pyobjc中工作,我應該使用NSThread還是python的線程模塊?我找不到任何關於如何選擇一個的信息。請注意,我並不關心Python的GIL,因爲我的任務完全沒有CPU綁定。pyobjc中的NSThread或pythons的線程模塊?

回答

2

這不會有什麼區別,你將獲得相同的行爲,但接口略有不同。使用最適合您系統的內容。

0

學會愛跑步循環。使用Cocoa's URL-loading system(或者,如果您需要普通套接字,請使用NSFileHandle),並在響應(或失敗)返回時讓它呼叫您。那麼你根本不必處理線程(URL加載系統會爲你使用一個線程)。

在Cocoa創建自己的線程的唯一時間是當你有一個大任務(> 0.1秒),你不能分手。

(有人可能會說的NSOperation,但NSOperationQueue is brokenRAOperationQueue不支持併發操作。很好,如果你已經有一堆NSOperationQueue代碼還是真的想爲工作NSOperationQueue準備,但如果你需要並發現在,跑環或線程)。

+0

嘿彼得, 感謝您的回覆。我的任務不幸可能會阻塞很長一段時間,因爲我正在做SOAP Web服務調用。我正在使用ZSI soap模塊來包裝SOAP方法如果你對pyobjc線程有更深入的瞭解 – 2009-02-20 17:28:22

0

我更喜歡原生python線程解決方案,因爲我可以加入並引用線程。 AFAIK,NSThread s不支持線程連接和取消,並且您可以使用python線程完成各種操作。

此外,這是一個令人失望的是NSThread s不能有多個參數,雖然有這個解決方法(如使用NSDictionary S和NSArray S),它仍然不是優雅和簡單調用帶有參數的線程按順序排列/相應的參數。

但是,是的,如果情況要求您使用NSThread s,根本不應該有任何問題。否則,堅持使用本地python線程是很酷的。

+0

由於Leopard,NSThread支持取消。 – 2009-11-05 16:02:58

0

我有一個不同的建議,主要是因爲GIL(全局解釋器鎖),特別是當你有多個CPU核心時,python線程是簡單的可怕的。有一個視頻演示文稿詳細描述了這一點,但我現在找不到視頻 - 這是由Google員工完成的。

無論如何,你可能想要考慮使用子進程模塊而不是線程(有一個可以執行的輔助程序,或者在系統上使用另一個二進制文件,或者使用NSThread,它會給你更多的性能可以使用CPython線程