【问题标题】:GAE background Threads not running in parallelGAE后台线程未并行运行
【发布时间】:2013-03-17 17:50:10
【问题描述】:

我需要一些帮助来解决 GAE 后台线程的问题。我想要做的是使用 GAE 后台线程和队列在多个线程上运行作业。代码在后端实例上运行,并被任务队列踢出。我得到的是线程中的作业是串行而不是并行运行的,这有点违背了目的。

from Queue import Queue
from google.appengine.api import background_thread
from google.appengine.api import taskqueue

q = Queue()

class Util():
   def work_in_background_thread(self):

       for p in portions:
            q.put(p)

        def _worker(index):
            portion = q.get()                
            do_work(portion)
            q.task_done()


        def do_work(snp_list):
            for snp in snp_list:
                self.find_snp_data(snp)


        for i in range(len(portions)):
            try:
                t = background_thread.BackgroundThread(target=_worker, args=[i])
                t.setDaemon(True)
                t.start()
            except:
                continue

        q.join()  

工作已经完成,但线程一个接一个地运行,所以这项工作需要几个小时才能运行!

【问题讨论】:

  • 只是好奇,但是您是否尝试过在模块的顶层定义您的函数?也许将它们嵌套在嵌套在 Class 下的函数下会抛出它。逻辑上不会这么想,但我不知道 BackgroundThread 会如何处理它。

标签: python multithreading google-app-engine python-2.7 queue


【解决方案1】:

如果您使用的是后端,那么它在单个实例上运行,而在开发服务器上,由于 python Global Interpreter Lock (GIL) ,不可能获得并发。我怀疑这可能是你的问题。也可以看看here 了解python不能处理并发,但是可以处理线程来提供更好的I/O

编辑

今天有一个新版本的dev_server:引用the blog

对 Python dev_appserver 进行了大修,该软件用于 在开发过程中模拟 App Engine。新的 dev_appserver 是 多线程,意味着开发更快,并提供更多 准确模拟生产环境。

【讨论】:

  • GIL 不应该阻止线程并发运行;它应该只停止线程同时运行
  • 我同意,但不要玩文字游戏。来自 wiki:在计算机科学中,并发是同时执行多个计算的系统的属性。 Python 无法通过线程处理并发。 @allyourcode 是的,GIL 将阻止线程并发运行。
  • 不,它们完全不同。如果你只有一个核心,那么无论你使用什么语言,线程都不能同时执行,但是它们可以通过线程之间的上下文切换来并发执行,这就是多核开始接管之前的并发方式。如果 GIL 阻止并发线程,App Engine 将不支持运行时多线程:python27.此限制仅存在于运行时:python。换句话说,这与 Python GIL 无关;这是一个特定于 App-Engine 运行时的问题。
  • 是的,我将并发理解为并行运行的借口。但就这一点而言,它们只是文字。但是对于这个问题,由于GIL,线程会一个接一个地执行还是我不正确?
  • GIL 有效地防止 Python 在多个内核上执行。但是,通过上下文切换仍然可以实现并发(就像在单核机器上一样)。我最初的观点是:GIL 不是多线程在 App Engine 运行时不起作用的原因:python。该限制特定于 App Engine 运行时:python。 App Engine 运行时:python27 仍然有 GIL,但那里支持多线程。
猜你喜欢
  • 2012-03-10
  • 1970-01-01
  • 1970-01-01
  • 2012-09-09
  • 2016-02-26
  • 2018-07-16
  • 2015-10-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多