如何用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
相关产品推荐
相关产品推荐

