Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/317.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.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中的异步流处理_Python_Streaming_Stream - Fatal编程技术网

Python中的异步流处理

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字节,因此上述方法限制了每次读取时的缓冲区大小,因

让我们从一个简单的例子开始。HTTP数据流的格式如下:

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的持续吞吐量