Python中的多线程:卡在最后一个线程

ute*_*ngr 5 python python-multithreading python-2.7 python-multiprocessing

我遇到了一个奇怪的情况,经过大量的试打后无法解决。我正在使用多线程(10)来读取url(100),并且在大多数情况下都能正常工作,但在某些情况下,它会卡在最后一个线程中。我等待它查看是否返回,并且花费了很多时间(1050秒),而其余9个线程在25秒内返回了。它表明我的代码有问题,但无法解决。有任何想法吗?

注意1:守护程序线程和非守护程序线程均会发生这种情况。

注2:URL和线程更改的数量。我尝试了10-100个不同的URL和5-50个不同的线程。

注意3:URL在大多数情况下完全不同。

import urllib2
import Queue
import threading
from goose import Goose

input_queue = Queue.Queue()
result_queue = Queue.Queue()
Run Code Online (Sandbox Code Playgroud)

线程工作者:

def worker(input_queue, result_queue):
    queue_full = true
    while queue_full:
        try:
            url = input_queue.get(False)
            read a url using urllib2 and goose
            process it
            result_queue.put(updated value)
        except Queue.Empty:
           queue_full = False
Run Code Online (Sandbox Code Playgroud)

主要过程:

for url in urls:
    input_queue.put(url)
thread_count = 5 
for t in range(thread_count):
        t = threading.Thread(target=worker, args= (input_queue, result_queue))
        t.start()

for url in urls:
    url = result_queue.get() # updates url   
Run Code Online (Sandbox Code Playgroud)

该过程在最后一次result_queue.get()调用时被阻塞。

注意:如果有人可以指出,我对我在这里做错的事情更感兴趣。因为我倾向于认为自己编写了正确的代码,但显然并非如此,这让我发疯了:)

sta*_*mer 2

您可以使用ThreadPoolExecutor来自concurrent.futures.

from concurrent.futures import ThreadPoolExecutor

MAX_WORKERS = 50

def worker(url):

    response = requests.get(url)

    return response.content

with ThreadPoolExecutor(max_workers=MAX_WORKERS) as executor:

    results = executor.map(worker, urls)

for result in results:

    print(result)
Run Code Online (Sandbox Code Playgroud)