在Python中从UDP执行异步套接字读取的最简单方法?
我试图找到在python中读取多个(大约100个)udp数据报套接字的最简单方法。我看过tornado,但tornado鼓吹http/tcp而不是udp支持在Python中从UDP执行异步套接字读取的最简单方法?,python,multithreading,sockets,udp,tornado,Python,Multithreading,Sockets,Udp,Tornado,我试图找到在python中读取多个(大约100个)udp数据报套接字的最简单方法。我看过tornado,但tornado鼓吹http/tcp而不是udp支持 现在我有专用于每个udp套接字的线程;然而,这似乎不是很有效。我必须承认我从未使用过它,但可能会满足您的需要 它支持很多协议,甚至是串行连接。我必须承认我从未使用过它,但可能会满足您的需要 它支持多种协议,甚至支持串行连接。该模块有一个内置的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(因为它不是一个流)有点用词不当,但基本用途应该很容易集成到应用程序中 请参阅以下网址的代码: