我需要做一些网络绑定调用(例如,获取一个网站),我不希望它阻塞 UI。如果我在 pyobjc 中工作,我应该使用 NSThread 还是 python 的线程模块?我找不到任何有关如何选择其中一个的信息。请注意,我并不真正关心 Python 的 GIL,因为我的任务根本不受 CPU 限制。
4 回答
没有区别,您将获得相同的行为,但界面略有不同。使用最适合您的系统的那个。
我有一个不同的建议,主要是因为 GIL(全局解释器锁)导致 python 线程非常糟糕,尤其是当你有多个 cpu 内核时。有一个视频演示非常详细,但我现在找不到视频 - 它是由 Google 员工完成的。
无论如何,您可能想考虑使用子进程模块而不是线程(有一个可以执行的帮助程序,或者在系统上使用另一个二进制文件。或者使用 NSThread,它应该给你比 CPython 获得的性能更高的性能线程。
学会爱上运行循环。使用Cocoa 的 URL 加载系统(或者,如果您需要普通套接字,则NSFileHandle)并让它在响应(或失败)返回时调用您。然后您根本不必处理线程(URL 加载系统将为您使用线程)。
几乎在 Cocoa 中创建自己的线程的唯一时间是当您有一个无法中断的大任务(>0.1 秒)时。
(有人可能会说 NSOperation,但是NSOperationQueue 坏了,RAOperationQueue不支持并发操作。如果你已经有一堆 NSOperationQueue 代码或者真的想为工作 NSOperationQueue 做准备,但是如果你现在需要并发,运行循环或线程。 )
我更喜欢原生 python 线程解决方案,因为我可以加入和引用线程。AFAIK, NSThread
s 不支持线程加入和取消,您可以使用 python 线程完成各种事情。
此外,NSThread
s 不能有多个参数,这很糟糕,尽管有解决方法(比如使用NSDictionary
s 和NSArray
s),但它仍然不像调用具有按顺序排列的参数/对应参数的线程那样优雅和简单.
但是,是的,如果情况要求您使用NSThread
s,则根本不应该有任何问题。否则,坚持使用本机 python 线程很酷。