Python[de]压缩模块在Linux上是线程安全的吗?在谷歌应用引擎上?
我应该使用什么压缩解压缩Python模块来构建一个系统,在这个系统中,Google App Engine(Python 2.7)与Linux机器上的应用程序交换压缩数据 还有两个额外的限制:Python[de]压缩模块在Linux上是线程安全的吗?在谷歌应用引擎上?,python,linux,multithreading,google-app-engine,compression,Python,Linux,Multithreading,Google App Engine,Compression,我应该使用什么压缩解压缩Python模块来构建一个系统,在这个系统中,Google App Engine(Python 2.7)与Linux机器上的应用程序交换压缩数据 还有两个额外的限制: Linux机器和GAE都将进行压缩/解压缩,并且需要安全地操作线程 我想做任何事情都不要使用类似文件的对象,因为AppEngine不能为动态文件提供常规的Python文件名 我这样问是因为从文档中不清楚某些[反]压缩模块是否是线程安全的 有人能帮忙填写压缩模块表吗 bz2:是安全的,per:但是有一条
- Linux机器和GAE都将进行压缩/解压缩,并且需要安全地操作线程李>
- 我想做任何事情都不要使用类似文件的对象,因为AppEngine不能为动态文件提供常规的Python文件名
- bz2:是安全的,per:但是有一条关于单个锁的评论让我想知道是否需要显式地管理锁
- zlib:?——发布GIL,根据: 但底层C代码据说是安全的:
- gzip:
- lzma:不安全,根据:
- RAM vs.file like objects=应用程序引擎不提供打开类似文件的对象的方法(除非文件作为应用程序的一部分上载)。因此,如果GAE从Linux设备中获取压缩数据,如果压缩模块坚持要我通过类似文件的对象,我不知道如何解压缩它。例如,gzip模块坚持使用文件名:
- linux=应用程序上的“线程安全”将位于Web服务器后面,因此可能会同时调用单独的线程进行压缩和/或解压缩。Linux应用程序首先从磁盘读取几千(数百万)个半随机压缩数据块,然后解压缩每个数据块,然后更改每个未压缩数据块,然后压缩更改的数据块,然后发送到GAE。目前,该应用程序使用zlib并在cherrypy中以轻负载运行,但一旦请求开始并行发生,就会引发zlib错误。一旦这个压缩问题解决了,我就会切换到nginx
- 你的问题基本上没有意义,因为你误解了一些基本的东西,制造了一些根本不存在的问题。我试着在评论中回答,但是你用这种方式做的事情是有限的,所以
我想做任何事情都不要使用类似文件的对象,因为AppEngine不能为动态文件提供常规的Python文件名 对于类似文件的对象,不需要文件名或文件。这就是文件状对象背后的全部思想
App Engine不提供打开类似文件的对象的方法(除非该文件是作为应用程序的一部分上载的) 不,您仍然混淆了文件对象和类似文件的对象。表示磁盘上的实际文件。GAE限制这些。类似文件的对象是具有相同API的任何对象,即行为类似于文件的对象,而实际上(不一定)不是文件。GAE不会阻止您创建类似文件的对象 -- 类文件对象的范例a的行为类似于文件对象,但它不是实际读取和写入文件,而是读取和写入内存中的字符串缓冲区 因此,您可以打开一个类似文件的对象进行如下写入:
my_file_like_obj = StringIO()
或者,如果您的内存中有一个缓冲区,并且希望能够像读取文件一样从中读取:
my_file_like_obj = StringIO(buffer)
然而,在许多情况下,Python/GAE已经为您提供了一个类似文件的对象,您可以按原样使用它,而无需将其读入缓冲区并包装到另一个类似文件的对象中。许多网络API会返回类似文件的对象,但不是全部 例如,如果调用
urllib2.urlopen
,结果是一个类似文件的对象;如果您调用urlfetch.fetch
,则它不是,因此如果需要,您必须使用StringIO(response.content)
因此,如果GAE从Linux设备中获取压缩数据,如果压缩模块坚持要我通过类似文件的对象,我不知道如何解压缩它 如果它坚持使用类似文件的对象,则为其指定一个类似文件的对象。创建实际文件是一种方法,但不是唯一的方法。如果您有
urllib2.urlopen
响应,只需传递该响应即可。如果内存中有缓冲区,只需将其包装在StringIO
中即可。等等
例如,gzip模块坚持使用文件名: 不,没有。阅读您链接到的文档: 类gzip.GzipFile([filename[,mode[,compress level[,fileobj[,mtime]]] 注意,这里有一个
fileobj
参数和一个filename
参数?文件的第一行说:
…必须为fileobj和filename中的至少一个指定非平凡值
因此,它不会坚持使用文件名
,除非fileobj
是None
。要绕过这个问题,只需…不要通过fileobj
的None
fileobj
必须是真实的文件对象,还是可以是另一个类似文件的对象?下一段说:
…新类实例基于fileobj,它可以是常规文件、StringIO对象或模拟文件的任何其他对象
好了,给你
不幸的是,Python2.x对于什么是类文件对象并不是100%一致的,文档也不总是清楚地说明这一点。(这在3.x中被清理了很多,但如果您使用GAE,这对您没有任何好处。) 如果某个API不喜欢您的类文件对象,因为它没有足够的模拟API,那么您将通过获取
AttributeError
来找到答案。例如,您可能会收到一个错误,说明从urllib2.urlopen
返回的对象没有
with lzma.LZMAFile(chunk_path) as f:
decompressed_chunk = f.read()
new_chunk = alter(decompressed_chunk)
sio = StringIO.StringIO()
with lzma.LZMAFile(fileobj=sio) as f:
f.write(new_chunk)
compressed_chunk = sio.getvalue()
send_to_gae(compressed_chunk)