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

如何同步两个Python程序实现同时启动并循环时长一致运行?

解决方案:同步发射端与接收端进程,统一循环时长

原代码的核心问题

先梳理下你代码里的明显问题,这些也是导致错误率高的原因:

  • 发射端:i+=1完全无效(i是循环遍历的临时变量);没导入subprocess和time.sleep依赖;
  • 接收端:函数定义缺括号first_receiver_data();i和receive_array都没初始化;带宽解析的代码可以简化;
  • 进程同步:bash并行启动没法保证两边的循环步骤严格对齐,时序混乱直接导致判断错误。

修改后的完整实现

核心思路

  1. 用Python multiprocessing模块管理两个进程,通过Barrier实现每轮循环的强同步,确保发射端和接收端同时开始当前轮操作;
  2. 统一每轮循环的固定时长(比如0.5秒),不管是执行./xecuate还是休眠,都通过计时补全到固定时长,彻底对齐时序;
  3. 修复所有语法和逻辑漏洞。

完整代码

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启动,进程的生命周期和同步都能精准控制。

使用注意事项

  1. 确保./xecuate有可执行权限,执行chmod +x xecuate即可;
  2. 如果./xecuate的输出格式变化,要调整split()[4]的索引,保证取到正确的带宽值;
  3. CYCLE_DURATION要设置得比./xecuate的最长执行时间长,否则补全休眠的逻辑会失效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 10:43:13