2014-03-27 28 views
0

我想阻止我的for循環中的失速。Python:你如何在循環中設置一個定時器?

import datetime as dt 
shopping_list = ['eggs','milk','bread'] 
def buy_item(item): 
    connect_to_website() 
    send_order_instruction(item) 
    disconnect() 

for i in range(0,len(shopping_list)): 
    item = shopping_list[i] 
    time_elapsed = 0 
    start_time = dt.datetime.now() 
    while time_elapsed < 60: 
     buy_item(item) 
     check_time = dt.datetime.now() 
     time_elapsed = check_time - start_time 

buy_item()登錄到網站並通過購買程序。但有時它會因爲互聯網連接,未找到項目,暫時停止網站暫時分秒或其他原因而卡住某個項目。功能簡單地拖延。我試過使用一個while循環,但沒有奏效。如果超過1分鐘,該如何跳過一個項目?是否有可能讓循環跳過某個特定商品的buy_item?在這種情況下會嘗試一下嗎?只是大聲思考。感謝您的幫助。對此,我真的非常感激。

+1

您正在尋找異步編程。在理想的情況下,你的'buy_item'方法應該接受一個超時參數和/或引發你可以捕獲的適當的錯誤(ItemNotFound,ConnectionError)。也許你想向我們展示你的'buy_item'代碼? –

+0

特別是,看看[Python裝飾器庫](https://wiki.python.org/moin/PythonDecoratorLibrary),其中包含用於函數重試,超時等的裝飾器。這可能是一件好事初始點。 – hbristow

回答

0

你不需要自己編碼。它應該被構建到用來處理HTTP請求的任何軟件中。

例如,requests庫允許您將其配置爲get()方法的附加參數。舊的urllib2庫也有一個超時參數。任何好的HTTP客戶端庫或軟件都會具有此功能;如果你的不是,看起來更難或找到另一個軟件。

您可能需要嘗試/除了處理HTTP軟件拋出的超時。

1
import threading 

thread = threading.Thread(target=buy_item, args=(item,)) 
thread.start() 

這樣做異步調用buy_item,你可以做sys.exit()內螺紋或可以等待線程使用的Thread.join()

更好看的線程模塊,或者多進程完成python模塊用於異步調用。

相關問題