我需要做一些網絡綁定調用(例如,獲取網站),我不希望它阻止用戶界面。如果我在pyobjc中工作,我應該使用NSThread還是python的線程模塊?我找不到任何關於如何選擇一個的信息。請注意,我並不關心Python的GIL,因爲我的任務完全沒有CPU綁定。pyobjc中的NSThread或pythons的線程模塊?
回答
這不會有什麼區別,你將獲得相同的行爲,但接口略有不同。使用最適合您系統的內容。
學會愛跑步循環。使用Cocoa's URL-loading system(或者,如果您需要普通套接字,請使用NSFileHandle),並在響應(或失敗)返回時讓它呼叫您。那麼你根本不必處理線程(URL加載系統會爲你使用一個線程)。
在Cocoa創建自己的線程的唯一時間是當你有一個大任務(> 0.1秒),你不能分手。
(有人可能會說的NSOperation,但NSOperationQueue is broken和RAOperationQueue不支持併發操作。很好,如果你已經有一堆NSOperationQueue代碼還是真的想爲工作NSOperationQueue準備,但如果你需要並發現在,跑環或線程)。
我更喜歡原生python線程解決方案,因爲我可以加入並引用線程。 AFAIK,NSThread
s不支持線程連接和取消,並且您可以使用python線程完成各種操作。
此外,這是一個令人失望的是NSThread
s不能有多個參數,雖然有這個解決方法(如使用NSDictionary
S和NSArray
S),它仍然不是優雅和簡單調用帶有參數的線程按順序排列/相應的參數。
但是,是的,如果情況要求您使用NSThread
s,根本不應該有任何問題。否則,堅持使用本地python線程是很酷的。
由於Leopard,NSThread支持取消。 – 2009-11-05 16:02:58
我有一個不同的建議,主要是因爲GIL(全局解釋器鎖),特別是當你有多個CPU核心時,python線程是簡單的可怕的。有一個視頻演示文稿詳細描述了這一點,但我現在找不到視頻 - 這是由Google員工完成的。
無論如何,你可能想要考慮使用子進程模塊而不是線程(有一個可以執行的輔助程序,或者在系統上使用另一個二進制文件,或者使用NSThread,它會給你更多的性能可以使用CPython線程
- 1. 如何停止pyobjc中的線程
- 2. 多線程與NSThread
- 3. ImportError:沒有名爲pyobjc的模塊
- 4. Python中的線程與線程模塊
- 5. iOS中的線程和隊列 - 非NSThread
- 6. 替代Pythons SQLite3模塊 - 也許MySQL
- 7. NSThread detachNewThreadSelector鎖定主線程
- 8. Python的線程模塊
- 9. PyObjC應用程序無法找到移動模塊
- 10. Python線程模塊
- 11. pyobjc中的userSpaceScaleFactor
- 12. 使用線程和隊列模塊的Python中的多線程
- 13. 如何使用[nsthread detachNewThreadSelector]中的塊
- 14. NSTask或NSThread?
- 15. DISPATCH_QUEUE或NSThread
- 16. detachNewThreadSelector的工作方式與NSThread performSelectorInBackground或NSThread alloc/init的工作方式不同嗎[線程啓動]
- 17. 簡單的NSThread或NSTimer
- 18. Node.js的MySQL的模塊 - 異步IO或者只是線程
- 19. pythons多進程模塊(用蒔蘿)給出了一個無益的AssertionError
- 20. Python線程模塊創建用戶空間線程或內核特殊線程
- 21. 主線程不在線程模塊中的主循環錯誤
- 22. 關於PyObjC的教程
- 23. NSThread調用線程委託功能
- 24. NSThread setStackSize沒有設置線程
- 25. 如何在iphone停止NSThread子線程
- 26. NSThread線程安全實現初始化。
- 27. NSThread callStackSymbols從另一個線程?
- 28. java中的子線程塊父線程
- 29. 線程模塊問題
- 30. Perl線程安全模塊
嘿彼得, 感謝您的回覆。我的任務不幸可能會阻塞很長一段時間,因爲我正在做SOAP Web服務調用。我正在使用ZSI soap模塊來包裝SOAP方法如果你對pyobjc線程有更深入的瞭解 – 2009-02-20 17:28:22