我将使用标准的Threading.Event进行翻译:
主线程进入一个循环,其中运行以下代码:
我们得到的是每500微秒运行一次select系统调用。这会对机器造成明显的负载,因为它有一个非常紧密的select循环。
请问是否有人能够解释一下其中的平衡问题,并说明为什么它与线程等待文件描述符不同。
其次,是否有更好的方法来实现大部分时间处于睡眠状态的主线程而不需要如此紧密的循环?
event.wait(60)
其他块在等待回复可用之前会阻塞请求,然后启动一个:
event.set()
我本来期望主线程会选择40秒,但实际情况并非如此。 这是从Python 2.7源码Lib/threading.py中得到的:
# Balancing act: We can't afford a pure busy loop, so we
# have to sleep; but if we sleep the whole timeout time,
# we'll be unresponsive. The scheme here sleeps very
# little at first, longer as time goes on, but never longer
# than 20 times per second (or the timeout time remaining).
endtime = _time() + timeout
delay = 0.0005 # 500 us -> initial delay of 1 ms
while True:
gotit = waiter.acquire(0)
if gotit:
break
remaining = endtime - _time()
if remaining <= 0:
break
delay = min(delay * 2, remaining, .05)
_sleep(delay)
我们得到的是每500微秒运行一次select系统调用。这会对机器造成明显的负载,因为它有一个非常紧密的select循环。
请问是否有人能够解释一下其中的平衡问题,并说明为什么它与线程等待文件描述符不同。
其次,是否有更好的方法来实现大部分时间处于睡眠状态的主线程而不需要如此紧密的循环?