Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.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
在Python中从UDP执行异步套接字读取的最简单方法?_Python_Multithreading_Sockets_Udp_Tornado - Fatal编程技术网

在Python中从UDP执行异步套接字读取的最简单方法?

在Python中从UDP执行异步套接字读取的最简单方法?,python,multithreading,sockets,udp,tornado,Python,Multithreading,Sockets,Udp,Tornado,我试图找到在python中读取多个(大约100个)udp数据报套接字的最简单方法。我看过tornado,但tornado鼓吹http/tcp而不是udp支持 现在我有专用于每个udp套接字的线程;然而,这似乎不是很有效。我必须承认我从未使用过它,但可能会满足您的需要 它支持很多协议,甚至是串行连接。我必须承认我从未使用过它,但可能会满足您的需要 它支持多种协议,甚至支持串行连接。该模块有一个内置的UDP服务器,具有线程和分叉选项 另一个选项是使用模块,该模块将允许您仅关注数据已可读取的套接字。该

我试图找到在python中读取多个(大约100个)udp数据报套接字的最简单方法。我看过tornado,但tornado鼓吹http/tcp而不是udp支持


现在我有专用于每个udp套接字的线程;然而,这似乎不是很有效。

我必须承认我从未使用过它,但可能会满足您的需要


它支持很多协议,甚至是串行连接。

我必须承认我从未使用过它,但可能会满足您的需要

它支持多种协议,甚至支持串行连接。

该模块有一个内置的UDP服务器,具有线程和分叉选项

另一个选项是使用模块,该模块将允许您仅关注数据已可读取的套接字。

该模块具有内置UDP服务器,具有线程和分叉选项


另一个选项是使用模块,该模块将允许您只关注数据已经可以读取的套接字。

我想对初始问题添加一些注释,尽管它已经有了一个可接受的答案

如果您有需要独立处理的多个连接(或者至少处理时不需要太多同步),则可以对每个连接使用一个线程并执行阻塞读取。现代调度程序不会因此而杀了你。这是处理连接的一种相当有效的方法。如果您担心内存占用,那么可以相应地减小线程的堆栈大小(不适用于python)

线程/进程将在大部分时间(等待新数据时)处于非忙等待状态,并且不会占用任何CPU时间


如果您不想要或不能使用线程,那么调用就是最好的选择。这也是一种低水平、高效的等待,作为奖励,它会为您提供触发的套接字列表。

我想对初始问题添加一些评论,尽管它已经有了一个可接受的答案

如果您有需要独立处理的多个连接(或者至少处理时不需要太多同步),则可以对每个连接使用一个线程并执行阻塞读取。现代调度程序不会因此而杀了你。这是处理连接的一种相当有效的方法。如果您担心内存占用,那么可以相应地减小线程的堆栈大小(不适用于python)

线程/进程将在大部分时间(等待新数据时)处于非忙等待状态,并且不会占用任何CPU时间

如果您不想要或不能使用线程,那么调用就是最好的选择。这也是一种低级别、高效的等待,作为奖励,它会为您提供已触发的套接字列表。

支持异步TCP和UDP套接字(以及许多其他功能)。与其他框架不同,使用asyncoro编程与线程编程非常相似。一个简单的UDP客户端/服务器程序,用于说明:

import socket, asyncoro

def server_proc(n, sock, coro=None):
    for i in xrange(n):
        msg, addr = yield sock.recvfrom(1024)
        print('Received "%s" from %s:%s' % (msg, addr[0], addr[1]))
    sock.close()

def client_proc(host, port, coro=None):
    sock = asyncoro.AsynCoroSocket(socket.socket(socket.AF_INET, socket.SOCK_DGRAM))
    msg = 'client socket: %s' % (sock.fileno())
    yield sock.sendto(msg, (host, port))
    sock.close()

if __name__ == '__main__':
    sock = asyncoro.AsynCoroSocket(socket.socket(socket.AF_INET, socket.SOCK_DGRAM))
    sock.bind(('127.0.0.1', 0))
    host, port = sock.getsockname()

    n = 100
    server_coro = asyncoro.Coro(server_proc, n, sock)
    for i in range(n):
        asyncoro.Coro(client_proc, host, port)
asyncoro尽可能使用高效的轮询机制。仅在Windows和UDP套接字中,它使用低效的“选择”(但在安装TCP时使用高效的Windows I/O完成端口)。

支持异步TCP和UDP套接字(以及许多其他功能)。与其他框架不同,使用asyncoro编程与线程编程非常相似。一个简单的UDP客户端/服务器程序,用于说明:

import socket, asyncoro

def server_proc(n, sock, coro=None):
    for i in xrange(n):
        msg, addr = yield sock.recvfrom(1024)
        print('Received "%s" from %s:%s' % (msg, addr[0], addr[1]))
    sock.close()

def client_proc(host, port, coro=None):
    sock = asyncoro.AsynCoroSocket(socket.socket(socket.AF_INET, socket.SOCK_DGRAM))
    msg = 'client socket: %s' % (sock.fileno())
    yield sock.sendto(msg, (host, port))
    sock.close()

if __name__ == '__main__':
    sock = asyncoro.AsynCoroSocket(socket.socket(socket.AF_INET, socket.SOCK_DGRAM))
    sock.bind(('127.0.0.1', 0))
    host, port = sock.getsockname()

    n = 100
    server_coro = asyncoro.Coro(server_proc, n, sock)
    for i in range(n):
        asyncoro.Coro(client_proc, host, port)

asyncoro尽可能使用高效的轮询机制。只有Windows和UDP套接字使用低效的“选择”(但如果安装了TCP,则使用高效的Windows I/O完成端口)。

我认为如果您坚持使用tornado的ioloop并希望进行UDP套接字处理,则应使用tornado IOStream的UDP版本。我在自己的项目中成功地做到了这一点。将其称为UDPStream(因为它不是一个流)有点用词不当,但基本用途应该很容易集成到应用程序中


请参阅以下代码:

我认为如果您坚持使用tornado的ioloop并希望进行UDP套接字处理,那么您应该使用tornado IOStream的UDP版本。我在自己的项目中成功地做到了这一点。将其称为UDPStream(因为它不是一个流)有点用词不当,但基本用途应该很容易集成到应用程序中

请参阅以下网址的代码: