python - Python 中的多线程 : Getting stuck at last thread

标签 python python-2.7 python-multiprocessing python-multithreading

我有一个奇怪的情况,经过多次命中试验后无法弄清楚。我正在使用多线程 (10) 来读取 url (100),它在大多数情况下工作正常,但在某些情况下,它会卡在最后一个线程。我等待它看它是否返回,这花了很多时间(1050 秒),而其余九个线程在 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()

线程 worker :

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

主要流程:

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   

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

注意:我对我在这里做错了什么更感兴趣,以防有人指出这一点?因为我倾向于认为我编写了正确的代码,但显然事实并非如此。

最佳答案

您可以使用 concurrent.futures 中的 ThreadPoolExecutor

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)

关于python - Python 中的多线程 : Getting stuck at last thread,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45822100/

相关文章:

python - 将 for 循环中的字符串连接成一行

python - 使用 matplotlib.pyplot 从 csv 中绘制数据

python-3.x - 具有异步功能的 Python 多处理

python - 如何优化 pandas 数据框的分块?

python - 在Python multiprocessing.Process 中,我们必须使用 `__name__ == __main__` 吗?

python密字程序

python - 使用相似的列合并 2 个数据框

python - 用日志数量而不是 %asctime 标记 python 记录器文件

python - 尝试调整由matplotlib.pyplot打印出的图像的大小

python - 改变 Dask Dataframe 的更简洁的方法是什么?