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

如何用Python asyncio实现动态创建周期性并行执行的任务?

解决asyncio周期性并行任务问题

你的代码当前只执行一次的原因是send_rcon_command协程仅运行一次就结束了。要实现周期性执行,需要给每个任务添加循环逻辑,让它们按指定周期重复运行。以下是修改后的完整代码:

import asyncio
from datetime import datetime


class RCONserver:
    
    def __init__(self, game: str, server_name=None):
        self.game = game
        self.server_name = server_name

    async def send_rcon_command(self, ip: str, port: str, period: int, cnt: int):
        # 按指定次数循环执行,cnt<=0时无限循环
        loop_count = 0
        while cnt <= 0 or loop_count < cnt:
            print(f"{datetime.now()}: {ip} {port}")
            await asyncio.sleep(int(period))
            loop_count += 1
    
    def get_servers(self):
        servers = []
        # 模拟从配置读取的服务器列表
        for server in ['game1','game2']:
            if server[:4] == "game":
                # 为每个服务器创建周期性任务协程
                servers.append(
                    self.send_rcon_command(
                        '192.168.178.1',
                        '30000',
                        5,  # 缩短周期方便测试,实际用配置中的值
                        3
                    )
                )
        return servers


async def main():
    obj = RCONserver('game')
    # 并行运行所有周期性任务
    await asyncio.gather(*obj.get_servers())

asyncio.run(main())

关键修改说明

  • 循环逻辑:在send_rcon_command中添加while循环,根据cnt参数控制执行次数——cnt>0时执行指定次数,cnt<=0时无限运行。
  • 执行顺序调整:原代码先sleep再执行,修改为先执行打印(实际业务逻辑)再sleep,符合常规周期性任务的执行节奏(立即执行第一次,之后按周期重复)。
  • 并行性保持:asyncio.gather依然会并行处理所有服务器的任务,每个任务的await asyncio.sleep不会阻塞其他任务,保证各周期独立运行。

如果需要让程序持续运行(比如无限执行任务),只需将cnt设为0或负数即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 00:35:15