在Linux上用python进行高频循环的最佳方法是什么?
如何在Linux上用python创建一个每秒100次的高频循环?它不需要非常精确,只要足够好,平均每秒循环100次 我试过:在Linux上用python进行高频循环的最佳方法是什么?,python,linux,python-3.3,Python,Linux,Python 3.3,如何在Linux上用python创建一个每秒100次的高频循环?它不需要非常精确,只要足够好,平均每秒循环100次 我试过: import time count = 0 start = time.time() while count <= 300: time.sleep(0.01) count = count + 1 end = time.time() print('avg. {0}'.format((end - start) / count)) 输出 但是有没有更好的方
import time
count = 0
start = time.time()
while count <= 300:
time.sleep(0.01)
count = count + 1
end = time.time()
print('avg. {0}'.format((end - start) / count))
输出
但是有没有更好的方法来实现这样的紧密循环呢
(这适用于需要频繁读取传入网络数据包并对其进行处理的服务器,以及无论是否有新数据包都要定期进行处理的服务器)。这仅适用于Pygame,但在循环结束时,您可以执行
mainClock = pygame.time.Clock()
mainClock.tick(100)
100或1000或其他任何东西。这仅适用于Pygame,但在循环结束时,您可以
mainClock = pygame.time.Clock()
mainClock.tick(100)
100或1000或其他任何东西。这里有一个简单的无漂移的ad-hock解决方案:
import time
INTERVAL = 0.01
last = time.time()
while True:
next = last + INTERVAL
time.sleep(next - time.time()) # it's ok to sleep negative time
last = next
do_your_thing_here()
下面是一个简单的无漂移的即兴解决方案:
import time
INTERVAL = 0.01
last = time.time()
while True:
next = last + INTERVAL
time.sleep(next - time.time()) # it's ok to sleep negative time
last = next
do_your_thing_here()
由于您在UNIX上,因此还可以使用
信号
模块
def handler(signum, frame):
print 'do it'
# This will fire an ITIMER_REAL signal every 0.01 seconds
signal.setitimer(signal.ITIMER_REAL, 0, 0.01)
# Tell the signal module to execute handler when upon signal
# ITIMER_REAL
signal.signal(signal.ITIMER_REAL, handler)
有关详细信息,请参阅:。我在自己的代码中使用了信号。我发现它非常健壮和精确,但范围有限(您只能设置有限数量的信号)。一个很大的优点是不需要线程来实现并发。请注意,当您将多线程代码与信号相结合时,必须小心在主线程中设置信号处理程序(
signal.signal
)。由于您在UNIX上,因此也可以使用signal
模块
def handler(signum, frame):
print 'do it'
# This will fire an ITIMER_REAL signal every 0.01 seconds
signal.setitimer(signal.ITIMER_REAL, 0, 0.01)
# Tell the signal module to execute handler when upon signal
# ITIMER_REAL
signal.signal(signal.ITIMER_REAL, handler)
有关详细信息,请参阅:。我在自己的代码中使用了信号。我发现它非常健壮和精确,但范围有限(您只能设置有限数量的信号)。一个很大的优点是不需要线程来实现并发。请注意,当您将多线程代码与信号组合在一起时,必须小心在主线程中设置信号处理程序(
signal.signal
)。您可能应该使用模块来等待I/O,而不是使用这样的紧环。这是不寻常的,您可能希望像这样睡觉。。。你能告诉我们你为什么要这样做吗?也许有更好的解决方案……也许您的任务可以通过观察者模式来实现。又称发布/订阅或事件/侦听器模式。根据您的需要,您可以按照lanzz或PyDispatcher的建议查看select
。啊哈select
听起来很像,但是我喜欢在其他平台上进行紧密循环的原因是,他们的异步选项导致事件在另一个线程上调用(并且线程安全变得复杂)-是否select
保持在同一个线程上?@markmnl您可以使用带有超时的select来执行定期处理。您可能应该使用模块来等待I/O,而不是使用这样的紧密循环。这很不寻常,您可能会想这样睡觉。。。你能告诉我们你为什么要这样做吗?也许有更好的解决方案……也许您的任务可以通过观察者模式来实现。又称发布/订阅或事件/侦听器模式。根据您的需要,您可以按照lanzz或PyDispatcher的建议查看select
。啊哈select
听起来很像,但是我喜欢在其他平台上进行紧密循环的原因是,他们的异步选项导致事件在另一个线程上调用(并且线程安全变得复杂)-是否select
保持在同一线程上?@markmnl您可以使用带有超时的select来执行定期处理。我不知道,但它的速度正好是100 FPS或(如果我的计算机太慢…)更少。我不知道,但它的速度正好是100 FPS或(如果我的计算机太慢…)更少。