2017-02-22 102 views
1

目前,我的結構是Flask, Redis, RabbitMQ and Celery。在我的刮,我使用requestsBeautifulSoup。 我的燒瓶在apache和wsgi上運行。這是刺激。用app.run(threaded=True)使用芹菜刮網站

我有25個API。 10是爲了像標題等一樣抓取URL,剩下的就是爲該URL使用第三方API。

我正在使用chord處理我的API並使用requests從API獲取數據。

對於我的弦頭我有3名工人,而在我的回調我只有1 我有有ConnectTimeoutErrorMaxRetryError的一個瓶頸問題。當我讀取某個線程時,它說要爲每個進程執行超時,因爲出現此錯誤意味着您正在重載遠程服務器。

問題是因爲我使用的是和絃,沒有意義使用時間睡眠,因爲25 API調用將同時運行。有沒有人遇到過這個?或者我做錯了什麼?

我讀的線程似乎是說要將請求更改爲pycurl或使用Scrapy。但我不認爲這是因爲ConnectTimeoutError是關於我的主機超載一個特定的URL服務器。

我的心絃過程:

callback = create_document.s(url, company_logo, api_list) 
header = [api_request.s(key) for key in api_list.keys()] 
result = chord(header)(callback) 

在api_request任務請求被使用。

回答

0

如果您想要限制同時運行的碎片數量,您可以創建一個排隊任務,檢查是否有另一個任務正在運行,與您希望運行的任務共享相同的屬性。如果任務正在運行,則告訴它睡幾秒鐘並再次檢查。當它看到一個沒有運行的時候,你可以排隊你想運行的任務。這將允許您睡眠異步任務。如果只有特定的號碼正在運行,您甚至可以計算任務並運行更多。有了這個,你可以同時運行5,看看它是否是節流足夠然後隊列中的另一個,當你看到一個已經完成等

::編輯::

Documentation for Celery Inspect

+0

你有一個鏈接一個文檔或示例代碼? – Bazinga

+0

我爲你添加了一個參考鏈接。 –