首页 > 解决方案 > 发送几个数据包后脚本无法正常运行

问题描述

我正在编写一个 python 程序,它在指定的时间内发送数据包。

发送脚本:

import socket
import time
import networkparam
import ray

ray.init()

transformer_sending_time = 0
final_message_sent = False
@ray.remote
def send_message():
    """
    Sends an abnormal measurement to the specified ip address or port number given by the networkparam module
    Parameters
    ----------
    None, however we can consider the definitions in networkparam as the function args
    Returns
    ----------
    None
    """

    global transformer_sending_time
    global final_message_sent
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    ip = networkparam.ip
    port = networkparam.controller_port
    message = b"bait"
    seconds = 15
  
    end_time = time.time() + seconds
    while time.time() < end_time:
        sock.sendto(message, (ip, port))
        transformer_sending_time = time.time()

    print("done")
    final_message_sent = True

s = send_message.remote()

接收脚本:

import time
import socket
import networkparam

ip = networkparam.ip
controller_port = networkparam.controller_port
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind((ip,controller_port))

while True:
    data, addr = sock.recvfrom(1024)
    if not data:
        break
    print("received message: %s" % data)

我期待发送脚本运行整整 15 秒并打印“完成”。但是,发送脚本发送数据包大约 2 秒,然后中断该功能并且永远不会打印“完成”。

标签: pythonsocketswhile-loopblockingray

解决方案


ray.remote是一个非阻塞操作。发生的事情是您的程序开始远程函数调用,然后结束。完成后,它会拆除光线簇并结束远程功能。

你应该添加

s = send_message.remote()
ray.get(s)

ray.get尝试获取send_message(并返回它)的返回值,这意味着程序将不得不等待远程函数完成。


推荐阅读