You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python如何每间隔指定秒数交替循环执行两个函数

实现两个函数按固定时长交替执行的解决方案

你之前的方案出错原因如下:

  • 直接用time.sleep()是放在函数调用之后,会等函数完整执行完才休眠,达不到控制函数运行时长的效果
  • 用多线程/asyncio时出现同时执行,是因为你没有等待前一个任务到点终止就启动了下一个任务,调整执行逻辑即可解决

方案1:函数可修改为增量执行(最推荐,无资源泄漏风险)

如果你的函数逻辑可以拆分为单次短执行的小步骤,不需要持续阻塞,用单线程时间窗口控制即可:

import time

def function1_step():
    # 替换为你的单次执行逻辑,不要写死循环,每次调用完成一小段操作就返回
    print("function1 运行中")

def function2_step():
    # 替换为你的单次执行逻辑
    print("function2 运行中")

while True:
    # 执行function1满5秒
    start_at = time.time()
    while time.time() - start_at < 5:
        function1_step()
        # 若CPU占用过高可添加短休眠降低负载:time.sleep(0.01)
    
    # 执行function2满3秒
    start_at = time.time()
    while time.time() - start_at < 3:
        function2_step()
        # 同理可加短休眠

方案2:函数为不可修改的阻塞逻辑,用多线程超时控制

如果你的函数本身是已经写好的阻塞逻辑(内置死循环/长时运算),可以用守护线程加超时等待的方式实现,保证两个函数不会同时执行:

import time
import threading

def function1():
    # 你的原有function1逻辑,不需要修改
    while True:
        print("function1 运行中")
        time.sleep(0.5)

def function2():
    # 你的原有function2逻辑,不需要修改
    while True:
        print("function2 运行中")
        time.sleep(0.5)

def run_func_with_timeout(func, timeout):
    # 启动守护线程,主逻辑退出时线程会自动终止
    task = threading.Thread(target=func, daemon=True)
    task.start()
    # 阻塞等待固定时长,到点后才会往下执行
    task.join(timeout)

while True:
    run_func_with_timeout(function1, 5)
    run_func_with_timeout(function2, 3)

注意:如果函数内有打开文件、数据库连接等需要手动释放的资源,守护线程强制终止可能导致资源泄漏,优先选择方案1。

方案3:asyncio异步场景实现

如果你的函数是异步函数,按顺序等待超时任务即可,不会出现同时执行的问题:

import asyncio

async def function1():
    # 你的异步function1逻辑
    while True:
        print("function1 运行中")
        await asyncio.sleep(0.5)

async def function2():
    # 你的异步function2逻辑
    while True:
        print("function2 运行中")
        await asyncio.sleep(0.5)

async def run_async_with_timeout(coro, timeout):
    try:
        await asyncio.wait_for(coro(), timeout=timeout)
    except asyncio.TimeoutError:
        pass

async def main():
    while True:
        await run_async_with_timeout(function1, 5)
        await run_async_with_timeout(function2, 3)

asyncio.run(main())

内容的提问来源于stack exchange,提问作者fk_7

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 07:09:07