最简单的方法在Python从UDP执行异步套接字读呢?(Easiest Way to Perform

2019-10-16 22:37发布

我试图找到读取从多个(约100)在python的UDP数据报套接字的最简单方法。 我已经看过龙卷风,龙卷风却宣称HTTP / TCP,而不是UDP支持。

现在我有专门为每个UDP套接字线程; 然而,这似乎并没有非常有效的。

Answer 1:

我必须承认,我从来没有使用过,但也许扭曲会满足您的需求。

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



Answer 2:

SocketServer的模块有一个内置的与线程和分叉的选择UDP服务器。

另一种选择是使用选择模块,让您只关注其中的数据已经可以读取插座。



Answer 3:

我想补充的初始问题的一些意见,即使它已经有一个公认的答案。

如果需要独立处理 (或至少处理没有太大的同步) 的多个连接 ,其好使用每个连接一个线程做阻塞读取。 现代调度不会杀你的那一个。 这是处理连接的相当有效的方式。 如果您担心内存占用,可以减少线程的堆栈大小相应(不适用于蟒蛇)。

的线程/进程将停留在非忙等待状态的大部分时间(在等待新的数据)和不消耗任何CPU时间。

如果你不想或者不能使用的线程, select呼叫definetly的路要走。 这也是低层次的,高效的等待和作为奖励,给你这引发套接字的列表。



Answer 4:

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安装)。



Answer 5:

我想,如果你坚持使用龙卷风ioloop和想要做的UDP套接字处理,你应该使用龙卷风的iostream的UDP版本。 我已经在我自己的项目成功的做到了这一点。 这是用词不当,一点点把它UDPStream(因为它是不完全流),但基本的使用应该很容易让你融入你的应用程序。

看到代码为: http://kyle.graehl.org/coding/2012/12/07/tornado-udpstream.html



文章来源: Easiest Way to Perform Asynchronous Socket Reading from UDP in Python?