我试图找到读取从多个(约100)在python的UDP数据报套接字的最简单方法。 我已经看过龙卷风,龙卷风却宣称HTTP / TCP,而不是UDP支持。
现在我有专门为每个UDP套接字线程; 然而,这似乎并没有非常有效的。
我试图找到读取从多个(约100)在python的UDP数据报套接字的最简单方法。 我已经看过龙卷风,龙卷风却宣称HTTP / TCP,而不是UDP支持。
现在我有专门为每个UDP套接字线程; 然而,这似乎并没有非常有效的。
我必须承认,我从来没有使用过,但也许扭曲会满足您的需求。
它支持很多协议,甚至串行连接。
该SocketServer的模块有一个内置的与线程和分叉的选择UDP服务器。
另一种选择是使用选择模块,让您只关注其中的数据已经可以读取插座。
我想补充的初始问题的一些意见,即使它已经有一个公认的答案。
如果您有需要独立处理 (或至少处理没有太大的同步) 的多个连接 ,其好使用每个连接一个线程做阻塞读取。 现代调度不会杀你的那一个。 这是处理连接的相当有效的方式。 如果您担心内存占用,可以减少线程的堆栈大小相应(不适用于蟒蛇)。
的线程/进程将停留在非忙等待状态的大部分时间(在等待新的数据)和不消耗任何CPU时间。
如果你不想或者不能使用的线程, select
呼叫definetly的路要走。 这也是低层次的,高效的等待和作为奖励,给你这引发套接字的列表。
asyncoro支持异步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套接字它使用低效率的“选择”(但如果使用高效的Windows I / O完成端口的TCP pywin32安装)。
我想,如果你坚持使用龙卷风ioloop和想要做的UDP套接字处理,你应该使用龙卷风的iostream的UDP版本。 我已经在我自己的项目成功的做到了这一点。 这是用词不当,一点点把它UDPStream(因为它是不完全流),但基本的使用应该很容易让你融入你的应用程序。
看到代码为: http://kyle.graehl.org/coding/2012/12/07/tornado-udpstream.html