2013-03-17 6 views
1

GAE 백그라운드 스레드에 문제가 있음을 알 수 있도록 도움이 필요합니다. 내가 뭘 하려는지 GAE 백그라운드 스레드와 대기열을 사용하여 여러 스레드에서 작업을 실행합니다. 이 코드는 Backend 인스턴스에서 실행되며 TaskQueue에 의해 시작됩니다. 내가 얻는 것은 스레드의 작업이 병렬이 아닌 연속적으로 실행된다는 것입니다. 어떤 종류의 목적은 패배합니다.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() 

작업이 완료되었지만 스레드가 차례로 실행되므로이 ​​작업을 실행하는 데 몇 시간이 걸릴 수 있습니다!

+1

궁금한 점이 있지만 모듈의 최상위 레벨에서 기능을 정의 해 보았습니까? 어쩌면 클래스 아래에 중첩 된 함수 아래에 중첩 시키면 던질 수 있습니다. 그렇게 논리적으로 생각하지는 않겠지 만, BackgroundThread가 어떻게 그것을 처리할지 모르겠습니다. – Dave

답변

0

백엔드를 사용하는 경우 단일 인스턴스에서 실행되며 dev 서버에서는 파이썬 Global Interpreter Lock (GIL)로 인해 동시성을 확보 할 수 없습니다. 그게 네가 문제라고 생각해. 또한 동시성을 처리 할 수 ​​파이썬을 이해하는 here을 살펴하지만, 더 나은 I/O를 제공하기 위해 스레드를 처리 할 수 ​​

편집

오늘 dev_server의 새로운 버전이 릴리스 된 : the blog에서 인용 :

Python dev_appserver를 대대적으로 개편 한이 소프트웨어는 개발 중 App Engine을 시뮬레이트하기 위해 에 사용되었습니다. 새로운 dev_appserver는 멀티 스레드입니다. 즉, 개발 속도가 빠르며 더 정확한 생산 환경 시뮬레이션을 제공합니다.

+0

GIL은 스레드가 동시에 실행되는 것을 중지하면 안됩니다. 스레드가 동시에 _ 실행되지 않도록해야합니다. – allyourcode

+0

나는 동의하지만 단어와 함께 놀 수는 없다. 위키에서 : 컴퓨터 과학에서 동시성은 여러 계산이 동시에 실행되는 시스템의 속성입니다. 파이썬은 스레드를 통한 동시성을 처리 할 수 ​​없다. @allyourcode 예 GIL은 스레드가 동시에 실행되는 것을 중지시킵니다. –

+0

아니요, 그들은 완전히 다릅니다. 코어가 하나만있는 경우 사용하는 언어에 관계없이 스레드를 동시에 실행할 수는 없지만 스레드 간 컨텍스트 전환을 통해 스레드를 동시에 실행할 수 있습니다. 이는 멀티 코어가 인계하기 전에 동시성이 수행 된 방식입니다. GIL이 동시 스레드를 방지하는 경우 App Engine은 런타임에 다중 스레드를 지원하지 않습니다 : python27. 이 제한은 런타임에만 존재합니다 : python. 즉, 이것은 파이썬 길 (GIL)과 아무런 관련이 없다. 이것은 App-Engine-runtime 관련 문제입니다. – allyourcode

관련 문제