2015-12-15 72 views
0

如何修改代碼(而不使用遞歸調用),以便只在隊列大小不超過100,000個項目時纔將其添加到隊列中。 否則,它會等待5秒鐘處理隊列項目(項目一旦被處理後將從隊列中刪除),然後在隊列中有空間時再次開始添加項目。否則等待另外5秒(依此類推)。註釋「#」中的部分是我建議的功能。我不介意遞歸解決方案,只要它是一個遞歸的尾調用優化方法,所以我不會遇到遞歸深度限制問題。將遞歸程序僅轉換爲循環

url_input_file = array of strings 
def worker(): 
       while threading.active_count() > 0: 
           url = q.get() 
           sendRequest(url) 
           q.task_done() 

q = Queue() 

for threads in range(1000): 
       t = threading.Thread(target = worker) 
       t.daemon = True 
       t.start() 

for url in url_input_file: 
      #if len(q) < 100000: 
       q.put(url) 
      #else: 
       #time.sleep(5) 
       #try to send it in the queue again 

q.join() 
+1

你爲什麼不只是做一個有界隊列,所以'put'塊直到工人完成了足夠的工作? – user2357112

+0

什麼版本的Python? – kevin628

回答

1

您可以通過反相隊列大小檢查和睡眠,直到隊列空間被釋放做到這一點,像

for url in url_input_file: 
    while len(q) >= 100000: 
     time.sleep(5) 
    q.put(url) 
+0

非常感謝!將嘗試它! –