Serial OperationQueue 与 Operations 同步计时器和睡眠
Serial OperationQueue with Operations synchronizing timer and sleep
我有一个串行 OperationQueue,其操作调用 usleep。我这样做是因为操作执行块与需要重复直到指定时间的定时器同步。
例如,将 3 个操作添加到 maxconcurrent 设置为 1 的队列中。每个操作都有一个计时器,该计时器会在 10 秒后重复。在触发第一个操作的计时器后,下一行代码是 usleep(10seconds)。 10 秒后,计时器完成,线程被唤醒。下一个操作开始。这是通过设计和工作完成的,但是,我担心睡眠线程的影响。有没有可能线程正在处理一些其他代码,上下文切换来处理操作,然后长时间休眠,暂停其他执行。 swift 是否知道让线程在操作休眠时执行其他块?
Does swift know to let the thread execute other blocks while the operation sleeps?
也许这只是一个措辞问题,但是线程 是 阻塞直到睡眠(和后续任务)完成,所以它不会被用来做任何其他事情。但是,当线程处于休眠状态时,核心 可以 切换上下文以让其他线程 运行 即使线程 运行 正在运行该操作。
所以使用usleep
(或者我可能会使用Thread.sleep(forTimeInterval: 10)
)避免了阻塞核心的问题,但它仍然阻塞了线程。并且线程相当有限(例如此时为 64 个)。因此,特别是如果您可能在任何给定时间都在进行大量此类操作,从而冒着耗尽有限线程的风险,我可能建议您也避免阻塞线程。 (话又说回来,如果你使用的 maxConcurrentOperationCount
为 1,只要你不做其他可能占用线程的事情,它可能不会是一个太严重的问题。)
例如,我可能会定义一个异步 Operation
子类,而不是休眠,我可能只是 asyncAfter
(或使用计时器)在未来 10 秒内完成操作.这样也没有线程被阻塞。或者我可能会考虑其他模式来解决更广泛的问题。如果不知道您要解决的更广泛的问题,很难说。
我有一个串行 OperationQueue,其操作调用 usleep。我这样做是因为操作执行块与需要重复直到指定时间的定时器同步。
例如,将 3 个操作添加到 maxconcurrent 设置为 1 的队列中。每个操作都有一个计时器,该计时器会在 10 秒后重复。在触发第一个操作的计时器后,下一行代码是 usleep(10seconds)。 10 秒后,计时器完成,线程被唤醒。下一个操作开始。这是通过设计和工作完成的,但是,我担心睡眠线程的影响。有没有可能线程正在处理一些其他代码,上下文切换来处理操作,然后长时间休眠,暂停其他执行。 swift 是否知道让线程在操作休眠时执行其他块?
Does swift know to let the thread execute other blocks while the operation sleeps?
也许这只是一个措辞问题,但是线程 是 阻塞直到睡眠(和后续任务)完成,所以它不会被用来做任何其他事情。但是,当线程处于休眠状态时,核心 可以 切换上下文以让其他线程 运行 即使线程 运行 正在运行该操作。
所以使用usleep
(或者我可能会使用Thread.sleep(forTimeInterval: 10)
)避免了阻塞核心的问题,但它仍然阻塞了线程。并且线程相当有限(例如此时为 64 个)。因此,特别是如果您可能在任何给定时间都在进行大量此类操作,从而冒着耗尽有限线程的风险,我可能建议您也避免阻塞线程。 (话又说回来,如果你使用的 maxConcurrentOperationCount
为 1,只要你不做其他可能占用线程的事情,它可能不会是一个太严重的问题。)
例如,我可能会定义一个异步 Operation
子类,而不是休眠,我可能只是 asyncAfter
(或使用计时器)在未来 10 秒内完成操作.这样也没有线程被阻塞。或者我可能会考虑其他模式来解决更广泛的问题。如果不知道您要解决的更广泛的问题,很难说。