我正在尝试使用asyncio在模拟中运行全局时钟。基本函数只是在一个永恒的while循环中计算秒数,模拟中的其他类和函数可以查看_seconds变量的值。现在,我想编写一个自定义的睡眠函数,它会一直等到秒数计数器超前一个特定值:
import asyncio
import time
_seconds = 0
def clock():
global _seconds
while True:
_seconds += 1
def sleep(seconds):
global _seconds
start = _seconds
passed = 0
while _seconds - start < seconds:
passed += 1
print(f"internal time passed: {passed}")
print(f"global time passed: {_seconds - start}")
loop = asyncio.get_event_loop()
# run in background - None defaults to current loop executor
loop.run_in_executor(None, clock)现在,如果我调用睡眠函数,我会得到计数器的值,这些值非常高,并且对于睡眠函数和全局秒计数器中的while循环来说,这些值非常不同,例如:
import clock
clock.sleep(100)
>>> "internal time passed: 45784"
>>> "global time passed: 109527"这是怎么回事?
发布于 2020-11-13 04:49:00
时钟在循环结束和计算全局持续时间之间保持滴答作响。print和字符串格式化都需要花费大量的时间。在循环之后立即使用全球时间。
def sleep(seconds):
global _seconds
start = _seconds
passed = 0
while _seconds - start < seconds:
passed += 1
end = _seconds # store time when done
print(f"internal time passed: {passed}")
print(f"global time passed: {end - start}")请注意,run_in_executor使用线程,而不是协程。这两个持续时间之间的剩余差异是Python和GIL切换线程的延迟,而不是asyncio切换协程的延迟。
https://stackoverflow.com/questions/64811302
复制相似问题