如何同步两个Python程序实现同时启动并循环时长一致运行?
解决方案:同步发射端与接收端进程,统一循环时长
原代码的核心问题
先梳理下你代码里的明显问题,这些也是导致错误率高的原因:
- 发射端:
i+=1完全无效(i是循环遍历的临时变量);没导入subprocess和time.sleep依赖; - 接收端:函数定义缺括号
first_receiver_data();i和receive_array都没初始化;带宽解析的代码可以简化; - 进程同步:bash并行启动没法保证两边的循环步骤严格对齐,时序混乱直接导致判断错误。
修改后的完整实现
核心思路
- 用Python
multiprocessing模块管理两个进程,通过Barrier实现每轮循环的强同步,确保发射端和接收端同时开始当前轮操作; - 统一每轮循环的固定时长(比如0.5秒),不管是执行
./xecuate还是休眠,都通过计时补全到固定时长,彻底对齐时序; - 修复所有语法和逻辑漏洞。
完整代码
import subprocess import time from multiprocessing import Process, Barrier, Manager # 固定每轮循环的总时长(可根据实际调整) CYCLE_DURATION = 0.5 def transmit_data(data, barrier): for bit in data: # 等待接收端准备好,同步启动本轮操作 barrier.wait() start_time = time.time() if int(bit) == 1: # 执行程序命中缓存 subprocess.run(['./xecuate'], capture_output=True) # 为0时不执行程序,后续补全休眠时长 # 补全剩余时间,确保每轮总时长严格一致 elapsed = time.time() - start_time if elapsed < CYCLE_DURATION: time.sleep(CYCLE_DURATION - elapsed) def receiver_data(barrier, result_list): receive_array = [] for _ in range(10): # 等待发射端准备好,同步启动本轮操作 barrier.wait() start_time = time.time() # 执行程序并直接获取文本输出,无需手动解码 exec_result = subprocess.run(['./xecuate'], capture_output=True, text=True) # 按空格分割后取第4个元素作为带宽值(根据你的输出格式调整索引) bandwidth = float(exec_result.stdout.split()[4]) # 判定状态并加入结果列表 receive_array.append(1 if bandwidth < 10000.0 else 0) # 补全剩余时间,确保每轮总时长严格一致 elapsed = time.time() - start_time if elapsed < CYCLE_DURATION: time.sleep(CYCLE_DURATION - elapsed) print('received array: ', receive_array) # 将结果传回主进程(可选) result_list.extend(receive_array) if __name__ == '__main__': # 示例:发射端要发送的10位数据 transmit_bits = ['1', '0', '1', '1', '0', '0', '1', '0', '1', '0'] # 初始化屏障,允许2个进程同步 sync_barrier = Barrier(2) # 用Manager共享列表传递接收结果(主进程可获取) with Manager() as manager: result_list = manager.list() # 创建并启动进程 tx_process = Process(target=transmit_data, args=(transmit_bits, sync_barrier)) rx_process = Process(target=receiver_data, args=(sync_barrier, result_list)) tx_process.start() rx_process.start() # 等待两个进程执行完毕 tx_process.join() rx_process.join() # 主进程打印最终结果 print('Final received data:', list(result_list))
关键细节说明
- 强同步机制:
Barrier(2)要求发射端和接收端都调用barrier.wait()后,才会继续执行下一轮,彻底避免了两边操作不同步的问题; - 固定循环时长:每轮操作后计算耗时,不足
CYCLE_DURATION的部分用休眠补全,确保两边每轮的总时长完全一致; - 代码简化:用
text=True让subprocess.run直接返回字符串输出,省去了解码步骤;用range(10)替代手动计数的while循环,逻辑更清晰; - 进程管理:用Python内置的多进程模块替代bash启动,进程的生命周期和同步都能精准控制。
使用注意事项
- 确保
./xecuate有可执行权限,执行chmod +x xecuate即可; - 如果
./xecuate的输出格式变化,要调整split()[4]的索引,保证取到正确的带宽值; CYCLE_DURATION要设置得比./xecuate的最长执行时间长,否则补全休眠的逻辑会失效。
内容的提问来源于stack exchange,提问作者user4686130
相关产品推荐
相关产品推荐

