我一直在想着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作业是可能的.任何人都有意见吗?
假设我有一个这样的网络服务器:
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 陷阱。