繁体   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