Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets 如何将Tokio设置为多线程UDP服务器?_Sockets_Rust_Udp_Rust Tokio - Fatal编程技术网

Sockets 如何将Tokio设置为多线程UDP服务器?

Sockets 如何将Tokio设置为多线程UDP服务器?,sockets,rust,udp,rust-tokio,Sockets,Rust,Udp,Rust Tokio,到目前为止,我发现的唯一一个例子是来自Tokio存储库的单线程例子。如何使用Tokio启动一个循环,生成一个新线程来处理新的UDP连接。回答问题 如何设置东京0.2“监听”UDP数据 另一方面: %nc-u 127.0.0.1 9999 阿尔法 贝塔 伽马射线 答案 如何将Tokio设置为多线程UDP服务器 上面的代码是多线程的。您可能希望创建并发(可能是并行)工作;这可以通过生成任务来完成: 回答问题 如何设置东京0.2“监听”UDP数据 另一方面: %nc-u 127.0.0.1

到目前为止,我发现的唯一一个例子是来自Tokio存储库的单线程例子。如何使用Tokio启动一个循环,生成一个新线程来处理新的UDP连接。

回答问题 如何设置东京0.2“监听”UDP数据

另一方面:

%nc-u 127.0.0.1 9999
阿尔法
贝塔
伽马射线
答案 如何将Tokio设置为多线程UDP服务器

上面的代码是多线程的。您可能希望创建并发(可能是并行)工作;这可以通过生成任务来完成:

回答问题 如何设置东京0.2“监听”UDP数据

另一方面:

%nc-u 127.0.0.1 9999
阿尔法
贝塔
伽马射线
答案 如何将Tokio设置为多线程UDP服务器

上面的代码是多线程的。您可能希望创建并发(可能是并行)工作;这可以通过生成任务来完成:


要在东京创建可调度的装置,您应该使用
tokio::task::spawn
。如果底层运行时是多线程的,那么这些单元将由多个线程完成

您可以通过在示例中添加几行代码来了解它的工作原理

fn main() {
...
    let jh = tokio::task::spawn(server.run());
    println!("udp server started {:?}", std::thread::current().id());
    jh.await?;
...
}
fn run
... 
   loop {
        if let Some((size, peer)) = to_send {
            let amt = socket.send_to(&buf[..size], &peer).await?;
            println!("eched back {:?}", std::thread::current().id());
        }

        to_send = Some(socket.recv_from(&mut buf).await?);
        println!("read some stuff {:?}", std::thread::current().id());
    }

要在tokio中创建可调度单元,您应该使用
tokio::task::spawn
。如果底层运行时是多线程的,那么这些单元将由多个线程完成

您可以通过在示例中添加几行代码来了解它的工作原理

fn main() {
...
    let jh = tokio::task::spawn(server.run());
    println!("udp server started {:?}", std::thread::current().id());
    jh.await?;
...
}
fn run
... 
   loop {
        if let Some((size, peer)) = to_send {
            let amt = socket.send_to(&buf[..size], &peer).await?;
            println!("eched back {:?}", std::thread::current().id());
        }

        to_send = Some(socket.recv_from(&mut buf).await?);
        println!("read some stuff {:?}", std::thread::current().id());
    }

这是一个很好的处理传入UDP数据的简单示例,但我要寻找的是一个多线程解决方案。我试图改进我的问题,使之更清晰。@allsey87这是多线程的;东京是。好吧,我想我现在开始明白了。我说的一次只有一个线程(可能来自Tokio的线程池)与
UdpSocket
中的(读/写数据)进行交互是正确的吗?@allsey87是的;一般来说,这就是您想要的,否则您需要执行某种类型的锁定以确保数据不会被破坏。对于诸如套接字之类的系统,您也可以选择同时使用它们。标记此项是正确的,因为它最接近于我的问题的解决方案。我有几个错误的想法,导致我认为我希望为每个向我的服务器发送数据的客户机都有一个线程。我现在可以看出,由于许多原因,这种逻辑存在相当大的缺陷。这是一个处理传入UDP数据的简单示例,但我正在寻找的是一种多线程解决方案。我试图改进我的问题,使之更清晰。@allsey87这是多线程的;东京是。好吧,我想我现在开始明白了。我说的一次只有一个线程(可能来自Tokio的线程池)与
UdpSocket
中的(读/写数据)进行交互是正确的吗?@allsey87是的;一般来说,这就是您想要的,否则您需要执行某种类型的锁定以确保数据不会被破坏。对于诸如套接字之类的系统,您也可以选择同时使用它们。标记此项是正确的,因为它最接近于我的问题的解决方案。我有几个错误的想法,导致我认为我希望为每个向我的服务器发送数据的客户机都有一个线程。我现在可以看出这个逻辑有很多缺陷。当你说“底层运行时”时,你是指执行者吗?Tokio的默认执行器不总是多线程执行器吗?同样,在您的循环中,您有
let amt=socket.send_to(&buf[…size],&peer)。wait我理解的正确吗?在返回的未来运行完成之前,此服务器将无法执行任何其他操作?@allsey87 Yes tokio的默认执行器是多线程的。是的,在本例中,主线程继续运行,处理程序在将来完成之前无法执行任何其他操作。但不必如此,您可以在任何地方以相同的方式生成另一个任务。例如,在读取udp数据包后,您可以生成另一个任务来处理它/发送响应。@boran否您不能从另一个任务/线程发送响应,因为您需要向它发送套接字,这将在当前循环中丢失。当您说“基础运行时”时,您是指执行者吗?Tokio的默认执行器不总是多线程执行器吗?同样,在您的循环中,您有
let amt=socket.send_to(&buf[…size],&peer)。wait我理解的正确吗?在返回的未来运行完成之前,此服务器将无法执行任何其他操作?@allsey87 Yes tokio的默认执行器是多线程的。是的,在本例中,主线程继续运行,处理程序在将来完成之前无法执行任何其他操作。但不必如此,您可以在任何地方以相同的方式生成另一个任务。例如,在读取udp数据包后,您可以生成另一个任务来处理它/发送响应。@boran否您不能从另一个任务/线程发送响应,因为您需要向它发送套接字,这将在当前循环中丢失。更改问题以使现有答案无效是违反堆栈溢出礼仪的。如果没有别的,这会让现有的回答者,那些试图帮助你的人,显得愚蠢和无能。这个问题没有改变,只是重新表述得更清楚。我知道在任何论坛上改变问题都是不礼貌的。老实说,虽然我的问题本来可以说得更清楚,但正是你的回答让我首先尝试更仔细地重新措辞……改变你的问题,使现有的答案无效,这是违反堆栈溢出礼仪的。如果没有别的,这会让现有的回答者,那些试图帮助你的人,显得愚蠢和无能