【问题标题】:NSThread or pythons' threading module in pyobjc?pyobjc 中的 NSThread 或 pythons 的线程模块?
【发布时间】:2009-02-20 05:53:14
【问题描述】:

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

【问题讨论】:

    标签: cocoa pyobjc


    【解决方案1】:

    这不会有任何区别,您将获得相同的行为,但界面略有不同。使用最适合您系统的。

    【讨论】:

      【解决方案2】:

      学会爱上运行循环。使用Cocoa's URL-loading system(或者,如果你需要普通的套接字,NSFileHandle)并让它在响应(或失败)返回时调用你。这样你就完全不用处理线程了(URL 加载系统会为你使用线程)。

      几乎在 Cocoa 中创建自己的线程的唯一时间是当您有一个无法拆分的大型任务(>0.1 秒)时。

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

      【讨论】:

      • 嘿彼得,感谢您的回复。不幸的是,由于我正在进行 SOAP Web 服务调用,因此我的任务可能会阻塞很长时间。我正在使用 ZSI 肥皂模块来包装 SOAP 方法,并且效果很好。如果您对 pyobjc 线程有更多见解,请告诉我。
      【解决方案3】:

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

      另外,很遗憾NSThreads 不能有多个参数,虽然有一些解决方法(比如使用NSDictionarys 和NSArrays),但它仍然没有那么优雅和简单调用具有按顺序排列的参数/相应参数的线程。

      但是,是的,如果情况需要您使用NSThreads,那应该没有任何问题。否则,坚持使用原生 python 线程很酷。

      【讨论】:

        【解决方案4】:

        我有一个不同的建议,主要是因为 GIL(全局解释器锁)导致 python 线程非常糟糕,尤其是当你有多个 cpu 内核时。有一个视频演示非常详细地介绍了这一点,但我现在找不到该视频 - 它是由一名 Google 员工完成的。

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

        【讨论】:

          猜你喜欢
          • 2023-01-11
          • 1970-01-01
          • 2011-11-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-05-01
          • 2012-06-28
          相关资源
          最近更新 更多