对于c编程,如果我想协调两个并发执行的进程,我可以使用sleep()。但是,我听说sleep()不是一个好主意来实现进程之间的事件顺序?有什么理由吗?
答案 0 :(得分:5)
sleep()
不是协调功能。从来没有。 sleep()
让你的过程做到这一点 - 进入睡眠状态,在一段时间内根本不运行。
你被误导了。在获取锁失败后,您的来源可能指的是所谓的退避,在这种情况下,随机sleep
可能是合适的。
通常在进程之间建立相对事件排序的方式(即,创建一个先发生的边缘)是使用并发控制结构,例如条件变量,它仅在某一点,或者一个更加钝的障碍,它会导致每个线程一直等到所有其他线程都到达程序中的那一点。
答案 1 :(得分:4)
使用sleep()
会影响延迟和CPU负载。假设您睡眠1ms并检查一些原子共享变量。平均延迟时间(至少)为0.5ms。您将在此非活动线程中消耗CPU周期来轮询共享原子变量。通常也不保证睡眠时间。
操作系统提供在线程/进程之间进行通信/同步的服务。那些具有低延迟,消耗较少的CPU周期,并且经常有其他保证 - 那些是您应该使用的 ...(例如condition variables,events,{{3等等)。当你使用那些线程/进程不需要“轮询”。内核在需要时唤醒等待的线程/进程(线程/进程“阻塞”)。
在某些罕见的情况下,轮询是线程/进程同步的最佳解决方案,例如一个semaphores,通常在通过内核的开销大于轮询所花费的时间时。
答案 2 :(得分:0)
睡眠不是一种非常强大的方法来处理进程之间的事件排序,因为有很多东西可能会出错。 如果你的sleep()被打断怎么办? 您需要通过“实现进程之间的事件顺序”来更具体地了解您的意思。
答案 3 :(得分:0)
就我而言,我在芹菜中使用了此功能。我正在做time.sleep(10)。如果celery_task每分钟被调用一次或两次,则工作正常。但它在一种情况下造成了混乱。
最终,我们不得不删除time.sleep,因为它阻塞了我10秒钟。