Python中的usleep

Python中的usleep,python,Python,我在Python2.7中搜索usleep()函数 有人知道它是否存在吗,也许是用另一个函数名 from time import sleep sleep(seconds) .由于usleep通常意味着要将执行延迟x微秒,因此必须将秒值除以1000000 import time time.sleep(seconds/1000000.0) time.sleep()以秒为参数 在时间上要非常小心。睡觉。我被python3用time.sleep烧死了,因为它不是单调的。如果挂钟倒转,time.slee

我在Python2.7中搜索usleep()函数

有人知道它是否存在吗,也许是用另一个函数名

from time import sleep
sleep(seconds)

.

由于
usleep
通常意味着要将执行延迟x微秒,因此必须将秒值除以1000000

import time
time.sleep(seconds/1000000.0)
time.sleep()
以秒为参数


在时间上要非常小心。睡觉。我被python3用time.sleep烧死了,因为它不是单调的。如果挂钟倒转,time.sleep调用将不会结束,直到挂钟赶上如果按计划进行睡眠时的时间。我还没有发现python的单调阻塞睡眠

相反,我建议使用Event.wait,如下所示:

def call_repeatedly(interval, func, *args, **kwargs):
    stopped = Event()
    def loop():
        while not stopped.wait(interval):  # the first call is in `interval` secs
            try:
                func(*args)
            except Exception as e:
                logger.error(e);
                if kwargs.get('exception'):
                    kwargs.get('exception')(e) # SEND exception to the specified function if there is one.
                else:
                    raise Exception(e)
    Thread(target=loop).start()
    return stopped.set
这个怎么样:

import time
def usleep(delay):
   mdelay = delay /1000
   now = time.time()
   while now + mdelay > time.time():
      pass

python的另一个睡眠函数

注意:由于GIL lock,不应用于多个线程,但对于多个子进程,它是很好的。时间也一样

我正在将一个C函数包装到Python中。我使用的是C库的nanosleep(),它会让线程停止运行那么长时间。这不是一种繁忙等待类型的延迟,它使用大量CPU来计算一些数学。代码如下。把所有的东西都放在一个文件夹里,比如说CWrapper

C_函数

#include <time.h>
int c_sleep_msec(long milliseconds);
int c_sleep_nsec(long nanoseconds);
您还可以使用相同的nanosleep()创建微秒函数

CWrapper.pyx

cdef extern from "C_functions.h":
    int c_sleep_msec(long milliseconds)
    int c_sleep_nsec(long nanoseconds)

def sleep_msec(milliseconds):
    return c_sleep_msec(milliseconds)

def sleep_nsec(nanoseconds):
    return c_sleep_nsec(nanoseconds)
setup.py

from distutils.core import setup
from distutils.extension import Extension
from Pyrex.Distutils import build_ext

setup(
  name = "CWrapper",
  ext_modules=[ Extension("CWrapper", ["CWrapper.pyx", "C_functions.c"]) ],
  cmdclass = {'build_ext': build_ext}
)
安装PythonPyrex。然后在linux终端上运行

python setup.py build_ext -i
它将创建CWrapper.c、build和CWrapper.so文件。在任何需要的地方使用cwraper.so,只需在python中导入即可

注意:为树莓Pi单独编译

现在,测试函数

Test_sleep.py

import serial
from multiprocessing import Process
import time
import CWrapper


class TestSleep:
    def __init__(self):
        self.delay_sec = 0.00000100
        self.delay_msec = 30
        self.delay_nsec = 1000 #200000000
        self.start_time = time.time()

        self.process_1 = Process(name="process_1", target=self.process_1_task, args=("process_1",))
        self.process_1.daemon = True
        self.process_1.start()

        self.process_2 = Process(name="process_2", target=self.process_1_task, args=("process_2",))
        self.process_2.daemon = True
        self.process_2.start()

        self.process_3 = Process(name="process_3", target=self.process_1_task, args=("process_3",))
        self.process_3.daemon = True
        self.process_3.start()

    def process_1_task(self, process_name):
        start = self.start_time
        delay_msec = self.delay_msec
        delay_sec = self.delay_sec
        delay_nsec = self.delay_nsec

        t1 = start
        for i in range(1, 81):
            status = CWrapper.sleep_msec(delay_msec)
            # status = CWrapper.sleep_nsec(delay_nsec)
            #status = time.sleep(delay_sec)
            t2 = time.time()
            elapsed_time = t2 - t1
            t1 = t2
            print process_name, i, "status:", status, "Elapsed-time:", elapsed_time


if __name__ == '__main__':
    test = TestSleep()
    # for i in range(1,10000):
    #     print "main thread", i
        # time.sleep(0.1)
    while True:    # Since daemon=True, main thread should check join() or stay in loop
        pass
更改time.sleep()的参数delay_sec,CWrapper.sleep_msec()的参数delay_msec,CWrapper.sleep_nsec()的参数delay_nsec。在thread_1_task()中取消对要测试的函数的注释。

三行调用“原始”usleep:

导入ctypes
libc=ctypes.CDLL('libc.so.6')
libc.usleep(300000)

在centos和alpine上测试了python 3.8.1

请仔细阅读您消耗100%CPU的数据,直到延迟结束?这是开发人员在MSDOS时代所做的,请不要在现代多任务系统上这样做。使用
time.sleep()
可以告诉操作系统内核暂停进程,直到超时完成,这样所有其他进程都可以完成它们的工作。这可能会消耗100%的CPU,但至少比睡眠更精确。如果你必须大量睡眠以保持计时,例如,在Rapsberry Pi时间上对协议进行比特切换。sleep()有时是保持CPU 100%负载的一种方式(我说的是系数20!),如果时钟源受到系统负载和电压降的影响,你实际上可以减慢时钟。。。记住,你不仅会失去睡眠的精确性,所以这就是你复制这篇文章的地方?您的示例仍然在滥用线程(既忙于旋转又阻止它们运行),因此无法进行比较。当解决一个感知到的问题时,请更好地定义它而不是“不恰当”。至于你的证据,忙碌等待的不是睡眠,它仍然是你的主线;您编写的例程只是停止所有Python线程。请阅读我的应用程序需要在每个线程中执行独立的睡眠操作。与Python的time.sleep()相比,我的函数在毫秒范围内的性能改进可以忽略不计。问题出在线程中。我相信时间。睡眠在Python3中应该是单调的;至少,程序会显示
\u PyTime\u GetMonotonicClock()
,以获取当前时间。我不能确定过去的行为是什么样子。我没有看到任何python文档。表示时间的引用。睡眠是单调的。Python3中的时间模块具有函数
monotonic
,该函数提供单调时间。答案中似乎没有明确说明:
时间。sleep
函数能够消耗一个浮点数,例如一秒的几分之一。因此,
time.sleep(0.1)
睡眠100毫秒。
from distutils.core import setup
from distutils.extension import Extension
from Pyrex.Distutils import build_ext

setup(
  name = "CWrapper",
  ext_modules=[ Extension("CWrapper", ["CWrapper.pyx", "C_functions.c"]) ],
  cmdclass = {'build_ext': build_ext}
)
python setup.py build_ext -i
import serial
from multiprocessing import Process
import time
import CWrapper


class TestSleep:
    def __init__(self):
        self.delay_sec = 0.00000100
        self.delay_msec = 30
        self.delay_nsec = 1000 #200000000
        self.start_time = time.time()

        self.process_1 = Process(name="process_1", target=self.process_1_task, args=("process_1",))
        self.process_1.daemon = True
        self.process_1.start()

        self.process_2 = Process(name="process_2", target=self.process_1_task, args=("process_2",))
        self.process_2.daemon = True
        self.process_2.start()

        self.process_3 = Process(name="process_3", target=self.process_1_task, args=("process_3",))
        self.process_3.daemon = True
        self.process_3.start()

    def process_1_task(self, process_name):
        start = self.start_time
        delay_msec = self.delay_msec
        delay_sec = self.delay_sec
        delay_nsec = self.delay_nsec

        t1 = start
        for i in range(1, 81):
            status = CWrapper.sleep_msec(delay_msec)
            # status = CWrapper.sleep_nsec(delay_nsec)
            #status = time.sleep(delay_sec)
            t2 = time.time()
            elapsed_time = t2 - t1
            t1 = t2
            print process_name, i, "status:", status, "Elapsed-time:", elapsed_time


if __name__ == '__main__':
    test = TestSleep()
    # for i in range(1,10000):
    #     print "main thread", i
        # time.sleep(0.1)
    while True:    # Since daemon=True, main thread should check join() or stay in loop
        pass