相关疑难解决方法(0)

Python - 是time.sleep(n)cpu密集型?

我一直在想着time.sleep(n)在python脚本中使用它来让它以不同的间隔执行作业.伪代码看起来像:

total_jobs = [...]

next_jobs_to_run = next_closest(total_jobs)
min_time_to_wait = closestTime(nextJobsToRun)

wait until min_time_to_wait
run them all 
get next jobs
Run Code Online (Sandbox Code Playgroud)

总而言之,程序会休眠,直到需要执行下一个作业.它运行工作,找到下一个要运行的工作,然后睡觉直到它需要运行下一个工作(继续无限).我打算在linux机器上运行它 - 使用cron作业是可能的.任何人都有意见吗?

python linux

12
推荐指数
2
解决办法
2万
查看次数

run_in_executor 会阻塞吗?

假设我有一个这样的网络服务器:

from fastapi import FastAPI
import uvicorn
import asyncio

app = FastAPI()

def blocking_function():
    import time
    time.sleep(5)
    return 42

@app.get("/")
async def root():
    loop = asyncio.get_running_loop()

    result = await loop.run_in_executor(None, blocking_function)
    return result

@app.get("/ok")
async def ok():
    return {"ok": 1}

if __name__ == "__main__":
    uvicorn.run(app, host="0.0.0.0", workers=1)
Run Code Online (Sandbox Code Playgroud)

据我了解,该代码将在默认的 ThreadExecutorPool 中生成另一个线程,然后在线程池中执行阻塞函数。另一方面,考虑GIL是如何工作的,CPython解释器只会执行一个线程100 ticks,然后它会切换到另一个线程以公平,并给其他线程一个进步的机会。在这种情况下,如果 Python 解释器决定切换到正在执行 blocks_function 的线程怎么办?它会阻止 who 解释器等待剩余的任何内容time.sleep(5)吗?

我问这个的原因是,我观察到,有时我的应用程序将阻止的blocking_function,但我不能完全肯定在玩什么的这里我blocking_function是很特殊-它通过win32com库会谈到COM API对象。我试图排除这是我陷入的一些 GIL 陷阱。

python multithreading asynchronous python-asyncio fastapi

5
推荐指数
1
解决办法
600
查看次数