Python[de]压缩模块在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:但是有一条

我应该使用什么压缩解压缩Python模块来构建一个系统,在这个系统中,Google App Engine(Python 2.7)与Linux机器上的应用程序交换压缩数据

还有两个额外的限制:

  • Linux机器和GAE都将进行压缩/解压缩,并且需要安全地操作线程
  • 我想做任何事情都不要使用类似文件的对象,因为AppEngine不能为动态文件提供常规的Python文件名
我这样问是因为从文档中不清楚某些[反]压缩模块是否是线程安全的

有人能帮忙填写压缩模块表吗

  • bz2:是安全的,per:但是有一条关于单个锁的评论让我想知道是否需要显式地管理锁

  • zlib:?——发布GIL,根据: 但底层C代码据说是安全的:

  • gzip:

  • lzma:不安全,根据:

谢谢大家!

编辑(回答abarnert的问题):

  • 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)