2013-03-10 64 views
0

我有類似的功能:對一系列值的子集進行迭代的Pythonic方法?

def long_running_with_more_values(start, stop): 
    headers = get_headers.delay(start, stop) 
    insert_to_db.delay(headers) 

該函數是從在平行於網請求的批處理數據。 get_headers + insert_to_db觸發消息堆棧並由芹菜工作人員處理,因此不會阻止執行。

它必須在開始和停止之間處理每個數字,但可以將其分成多個部分(範圍)。

我發現操作get_headers是最佳的當範圍爲〜20000,其中範圍=(停止 - 啓動)

我想知道我怎麼可以拆分任意範圍爲20000組,每個運行通過這個函數分組,所以我最終得到的函數被多次調用,具有不同的開始和結束值,但仍然覆蓋了前一個範圍。

所以爲1和100000分別我期望get_headers啓動和停止初始值與以下調用5次:

[1,20000][20001,40000][40001,60000][60001,80000][80001,100000] 
+0

如果你只是在尋找一種方法來將一個列表分割成'n'個元素的段,[看到這個問題](http://stackoverflow.com/questions/1624883/alternative-way-to-split-一個列表 - 到 - 組 - 的-N)。 – kojiro 2013-03-10 00:56:27

+0

不,我想分割一個任務,通過將兩個ID的範圍指定爲更高效的子任務來處理項目 – Jharwood 2013-03-10 00:59:18

+0

考慮'range(start,stop,20000)'來獲得分區邊界。 – kojiro 2013-03-10 01:10:35

回答

1
def long_running_with_more_values(start, stop): 
    while start < stop: 
     if stop - start < 20000: 
      headers = get_headers.delay(start, stop) 
      break 
     else: 
      headers = get_headers.delay(start, start + 20000) 
      start += 20000 
    insert_to_db.delay(headers) 

注意headers只會存儲返回值最後致電get_headers.delay()。您可能需要將代碼更改爲headers += get_headers.delay(start, stop)。我不知道get_headers.delay()方法的返回值是什麼。

+0

這個問題與我所看到的是,你最終會得到你指定的範圍之外的標題,根據規範,這是不允許的。 – Jharwood 2013-03-11 09:06:04

+0

我不明白這是怎麼發生的。你能舉個例子嗎? – 2013-03-11 18:52:26

+0

不理我,我錯了 – Jharwood 2013-03-12 11:34:35