首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是什么导致了python-asyncio中while循环的时序差异?

是什么导致了python-asyncio中while循环的时序差异?
EN

Stack Overflow用户
提问于 2020-11-13 04:31:03
回答 1查看 26关注 0票数 0

我正在尝试使用asyncio在模拟中运行全局时钟。基本函数只是在一个永恒的while循环中计算秒数,模拟中的其他类和函数可以查看_seconds变量的值。现在,我想编写一个自定义的睡眠函数,它会一直等到秒数计数器超前一个特定值:

代码语言:javascript
复制
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循环来说,这些值非常不同,例如:

代码语言:javascript
复制
import clock
clock.sleep(100)
>>> "internal time passed: 45784"
>>> "global time passed: 109527"

这是怎么回事?

EN

回答 1

Stack Overflow用户

发布于 2020-11-13 04:49:00

时钟在循环结束和计算全局持续时间之间保持滴答作响。print和字符串格式化都需要花费大量的时间。在循环之后立即使用全球时间。

代码语言:javascript
复制
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切换协程的延迟。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64811302

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档