簡體   English   中英

GAE python線程不並行執行

[英]GAE python threads not executing in parallel

我試圖在GAE上使用Python創建一個簡單的Web應用程序。 應用程序需要為每個收到的請求生成一些線程。 為此,我使用的是python的線程庫。 我生成所有線程,然后等待它們。

t1.start()
t2.start()
t3.start()

t1.join()
t2.join()
t3.join()

應用程序運行正常,除了線程是串行而不是並發運行的事實(通過在每個線程的run()方法的開頭/結尾打印時間戳來確認)。 我已按照http://code.google.com/appengine/docs/python/python27/using27.html#Multithreading中的說明啟用了多線程

我的app.yaml看起來像:

application: myapp
version: 1
runtime: python27
api_version: 1
threadsafe: true

handlers:
- url: /favicon\.ico
  static_files: favicon.ico
  upload: favicon\.ico

- url: /stylesheet
  static_dir: stylesheet

- url: /javascript
  static_dir: javascript

- url: /pages
  static_dir: pages

- url: .*
  script: main.app

我確保我的本地GoogleAppLauncher通過在首選項中明確設置路徑來使用python 2.7。

我的線程的平均運行時間為2-3秒,在這里他們進行url打開調用並對結果進行一些處理。

我做錯了什么,或者缺少一些配置來啟用多線程?

您是否在dev_appserver中或將應用程序上傳到生產服務后遇到此問題? 從你提到的GoogleAppLauncher看起來你可能會在dev_appserver中看到這個; dev_appserver不會模擬生產服務器的線程行為,您會驚訝地發現在部署應用程序后它可以正常工作。 (如果沒有,請在此處添加評論。)

另一個想法是:如果你主要等待urlfetch,你可以使用urlfetch的異步接口並行運行許多urlfetch調用: http//code.google.com/appengine/docs/python/urlfetch/asynchronousrequests.html

這種方法不需要線程。 (它仍然沒有正確地並行化dev_appserver中的請求;但它確實在生產服務器上正確地執行了操作。)

GAE的多線程注釋僅用於處理請求的方式 - 它們不會從根本上改變Python線程的工作方式。 具體來說, 線程模塊文檔中的“CPython實現細節”注釋仍然適用。

還值得一提的是GAE文檔的“沙盒”部分中的注釋:

請注意,當請求結束時,線程將由運行時連接,因此線程無法在請求結束時運行。

如果您的線程主要等待數據存儲區操作,您可以嘗試NDB模塊,它是1.6.2的一部分。 語義將與您正在做的非常接近。

IIRC,多線程標志使一個服務器實例能夠在不同的線程上提供多個請求,但不允許您自己啟動線程。 如果在返回之前不需要同步它們,則可以將它們放在單獨的任務上並將它們委派給一個或多個任務隊列。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM