XPC 连接如何以线程方式处理?

Posted

技术标签:

【中文标题】XPC 连接如何以线程方式处理?【英文标题】:How are XPC connections handled thread-wise? 【发布时间】:2015-03-18 10:15:37 【问题描述】:

假设我有一个 XPC 服务和两个用户可见的应用程序(菜单栏项和主应用程序)。两者都连接到 XPC 服务。

如果这两个应用组件都发送“create Foo”消息,它们是如何分派的?毕竟是一个进程,所以是按顺序到达还是会使用多个队列?

XPC 服务使用 Core Data,所以我担心是否必须创建全局队列或以任何其他方式确保线程限制。

【问题讨论】:

【参考方案1】:

无论何时您在非单线程可执行文件中使用 CoreData,无论是否使用 XPC,您都需要通过限制、仅主线程或私有队列来解决线程问题。由于 XPC 服务没有明确定义的主线程概念(显然,第一个线程将永远是主线程,但实际上……)NSMainQueueConcurrencyType 可能没有用。我没有看到任何迹象表明 XPC 对请求的线程亲和性做出了任何承诺,所以我通常假设 XPC 侦听器的线程管理是我无法控制的实现细节(直到执行转换到我的代码)。考虑到这一点,NSConfinementConcurrencyType 看起来像是一堆工作。所以,如果是我,我会选择NSPrivateQueueConcurrencyType

即使您凭经验观察到一次只执行一个请求,最好假设这不能保证。

【讨论】:

所以我应该把所有核心数据操作放在一个我控制自己的队列上,不要对框架做任何假设。听起来很合理。由于私有队列具有全局唯一 ID,这甚至可以与并行 XPC 线程一起使用(如果存在这种情况),对吗? CoreData 为您提供了这种机制。使用NSPrivateQueueConcurrencyType 为您的XPC 服务创建NSManagedObjectContext,然后使用-performBlock:performBlockAndWait: 包装您与CoreData 的所有交互。 不知道!这很棒。所以在我的情况下,我必须简单地将 XPC 服务的每个操作包装在一个工作单元块中,将它排入队列,然后像这样摆脱竞争条件?!代码看起来不错,但我无法相信 Core Data 的每个 MOC 单线程的限制会带来这么大的好处。

以上是关于XPC 连接如何以线程方式处理?的主要内容,如果未能解决你的问题,请参考以下文章

当取消处理程序引用自身时,在 -dealloc 中取消 XPC 连接

哪个处理程序在 macos xpc 中处理来自服务器的回复

XPC 和异常处理

当 launchd 终止进程时是不是调用 XPC 中断处理程序?

如何以最佳方式在 C# 中处理 SQL 连接? [复制]

XPC 到 XPC 通信