Python中的异步流处理
让我们从一个简单的例子开始。HTTP数据流的格式如下:Python中的异步流处理,python,streaming,stream,Python,Streaming,Stream,让我们从一个简单的例子开始。HTTP数据流的格式如下: MESSAGE_LENGTH, 2 bytes MESSAGE_BODY, REPEAT... 目前,我使用urllib2检索和处理流数据,如下所示: length = response.read(2) while True: data = response.read(length) DO DATA PROCESSING 它可以工作,但由于所有消息的大小都是50-100字节,因此上述方法限制了每次读取时的缓冲区大小,因
MESSAGE_LENGTH, 2 bytes
MESSAGE_BODY,
REPEAT...
目前,我使用urllib2检索和处理流数据,如下所示:
length = response.read(2)
while True:
data = response.read(length)
DO DATA PROCESSING
它可以工作,但由于所有消息的大小都是50-100字节,因此上述方法限制了每次读取时的缓冲区大小,因此可能会影响性能
可以使用单独的线程进行数据检索和处理吗?当然可以,有很多不同的技术可以做到这一点。通常,您将拥有一组只检索数据的进程,并增加该池中的进程数,直到您的bandwith用完为止,或多或少。这些进程将数据存储在某个地方,然后您就有其他进程或线程从存储数据的任何地方提取并处理数据 所以你的问题的答案是“是的”,你的下一个问题是“如何”,然后真正擅长这方面的人会想知道更多。:-) 如果您大规模地进行此操作,可能会变得非常棘手,您不希望它们相互重叠,Python中有一些模块可以帮助您完成这一切。正确的方法在很大程度上取决于我们讨论的规模,如果你想在多个处理器上运行,或者甚至在完全独立的机器上运行,以及我们讨论的数据量 我只做过一次,规模不是很大,但最终有一个进程得到了一长串应该处理的URL,另一个进程将该列表发送到一组单独的进程,只需将带有URL的文件放在单独的目录中作为“队列”即可。获取URL的单独进程将查看它们自己的队列目录,获取URL并将其粘贴到另一个“outqueue”目录中,在那里我有另一个进程将这些文件分派到另一组队列目录中,用于处理进程 这很好,如果需要,可以使用NFS在网络上运行(尽管我们从未尝试过),如果需要,还可以扩展到机器上的进程负载(尽管我们也从未这样做)
可能还有更聪明的方法。是的,如果你的格式基本上是固定的,那么这是可以做到的,也没有那么难 我在Python2.2.3中将它与httplib一起使用,发现它的性能非常糟糕,就像我们一起对它进行黑客攻击一样(基本上是用猴子将基于select()的套接字层修补到httplib中) 诀窍是获取套接字并自己进行缓冲,这样就不会与中间层争夺缓冲(当我们有用于分块http解码的httplib缓冲区,用于读取()的套接字层缓冲区时,这会导致糟糕的性能) 然后有一个状态机,在需要时从套接字获取新数据,并将完成的块推送到一个队列中。队列为处理线程提供数据 我使用它来传输文件,校验和(zlib.ADLER32)在一个额外的线程中传输它们,并在第三个线程中将它们写入文件系统。通过套接字和HTTP/分块开销在本地机器上实现大约40 MB/s的持续吞吐量