Pyobjc中的NSThread或pythons的线程模块?

时间:2009-02-20 05:53:15

标签: cocoa pyobjc

我需要做一些网络绑定调用(例如,获取网站),我不希望它阻止UI。如果我在pyobjc工作,我应该使用NSThread或python的线程模块吗?我找不到任何关于如何选择其中一个的信息。注意,我并不关心Python的GIL,因为我的任务根本不受CPU限制。

4 个答案:

答案 0 :(得分:2)

它没有任何区别,您将获得与略有不同的接口相同的行为。使用最适合您系统的任何一种。

答案 1 :(得分:0)

学会喜欢跑步循环。使用Cocoa's URL-loading system(或者,如果您需要普通套接字NSFileHandle),并在响应(或失败)回来时让它给您打电话。然后你根本不需要处理线程(URL加载系统会为你使用一个线程)。

在Cocoa中创建自己的线程的唯一时间就是当你有一个无法解决的大任务(> 0.1秒)时。

(有人可能会说NSOperation,但是NSOperationQueue is brokenRAOperationQueue不支持并发操作。如果您已经拥有一堆NSOperationQueue代码或者真的想要为NSOperationQueue工作做准备,那很好,但是如果你现在需要并发,运行循环或线程。)

答案 2 :(得分:0)

我更喜欢原生的python线程解决方案,因为我可以加入并引用线程。 AFAIK,NSThread不支持线程加入和取消,你可以用python线程完成各种各样的事情。

另外,NSThread s不能有多个参数,虽然有一些解决方法(比如使用NSDictionaryNSArray),但这仍然不是一件好事。优雅而简单,如调用带有参数/相应参数的参数的线程。

但是,如果情况要求你使用NSThread,那就不应该有任何问题。否则,坚持使用本机python线程很酷。

答案 3 :(得分:0)

我有一个不同的建议,主要是因为python线程因GIL(全局解释器锁)而变得非常糟糕,特别是当你有多个cpu核心时。有一个视频演示以令人难以忍受的细节进入,但我现在无法找到视频 - 它是由Google员工完成的。

无论如何,你可能想要考虑使用子进程模块而不是线程(有一个你可以执行的辅助程序,或者在系统上使用另一个二进制文件。或者使用NSThread,它应该会给你提供比你更多的性能使用CPython线程。