簡體   English   中英

具有隊列和無響應線程的Python線程

[英]Python threading with queue and unresponsive threads

在我的python代碼中,我調用了一個外部api以獲取圖像網址的列表。 對於每個這些URL,我創建一個線程來生成縮略圖。 這是感興趣的代碼部分:

def process_image(image, size, cropping, counter, queue):
    options = dict(crop=cropping)
    img = get_thumbnail(image['url'], size, **options)
    queue.put((counter, img))
    return img

...

queue = Queue()

# Get some information about an artist. Images are also included.
artist = get_profile(artist_id, buckets)

# Generate images' thumbnails
threads = [Thread(target=process_image, args=(img, '500', 'center', counter, queue)) for counter, img in enumerate(artist.data['images'])]

for p in threads:
    p.start()
for p in threads:
    p.join()

imgs = []
# Collect processed images from threads
while not queue.empty():
    el = queue.get()
    imgs.append((el[0], el[1]))

我的問題是某些網址無法使用,我的意思是,如果我在瀏覽器中復制粘貼該網址,它將繼續加載並加載並加載更多的內容,直到返回超時為止。 顯然,我添加了多線程來加快處理速度。 導致此問題的第一個URL是第四個,因此,如果我添加...

# Generate images' thumbnails
threads = [Thread(target=process_image, args=(img, '500', 'center', counter, queue)) for counter, img in enumerate(artist.data['images'])]
treads = threads[:3]

一切都會按預期且非常快速地工作,否則它會阻塞很長時間,並最終終止執行。 我想為線程設置某種超時(例如1秒)以運行該函數,如果url不起作用並且線程在超時之前未完成,則退出該線程。

提前謝謝你的幫助。

如果get_thumbnail函數是您的函數,則按照@turbulencetoo的建議在其中建立超時。 否則,請查看信號模塊以將超時添加到process_image 正如評論中所建議的那樣,您可能還會發現使用多處理與線程的更多好處。多處理模塊的接口與線程的接口幾乎相同,因此切換起來不需要太多工作。

其他問題所述 ,沒有正式的方法可以殺死Python中的線程。 在線程正在執行您控制的工作的情況下(而不是阻塞例如在網絡請求上),您可以使用信號變量使線程殺死自己,但是這里似乎不是這種情況。

為了並行下載多個資源,您可能想要使用像pycurl這樣的庫,該庫將使用特定於操作系統的功能來允許多個請求在單個線程上異步執行。 這使您可以使用諸如set_timeout之類的方法,這些方法提供了一種相當干凈的方式來處理您描述的問題。

我終於找到了基於@turbulencetoo的評論的解決方案。

get_thumbnail不是我的代碼的一部分,而是一個外部庫的一部分,因此我無法在我的代碼中設置任何類型的超時。 我以為該庫沒有配置項目來設置url請求期間的超時,但是顯然存在(我已經讀過它,但我誤會了)。

@RobertB是的,join()有一個超時參數,我已經嘗試設置該參數,但是沒有用。

暫無
暫無

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

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