Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Linux上用python进行高频循环的最佳方法是什么?_Python_Linux_Python 3.3 - Fatal编程技术网

在Linux上用python进行高频循环的最佳方法是什么?

在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)) 输出 但是有没有更好的方

如何在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))
输出

但是有没有更好的方法来实现这样的紧密循环呢


(这适用于需要频繁读取传入网络数据包并对其进行处理的服务器,以及无论是否有新数据包都要定期进行处理的服务器)。

这仅适用于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或(如果我的计算机太慢…)更少。