因为get_url比save_pic快,所以需要将获取到的直链分配给队列执行提升效率。
尝试了Queue的put,get,但是不知道为什么只执行对应进程数的get_url()部分,而save_pic部分并没有执行。
def get_url()
# 读取excel内的链接,操作后生成下载直链
......
if pic_url.status_code == 200:
save_pic(down_url, pic_name, pic_id)
elif pic_url.status_code == 400:
# 重新获取下载直链
......
save_pic(down_url, pic_name, pic_id)
else:
pass
def save_pic(down_url, pic_name, pic_id)
# 判断并创建对应需储存的目录
# with open储存图片
您可以使用Python的多进程库multiprocessing来实现这个需求。在这种情况下,您可以使用一个进程负责获取URL,并将获取的URL放入一个队列中。然后,您可以使用多个进程并行地从队列中获取URL并执行save_pic()函数。
下面是一个示例代码,该代码使用4个进程来并行获取URL并执行save_pic()函数:
from multiprocessing import Process, Queue
def get_url(url_queue):
# 读取excel内的链接,获取下载直链
while True:
# 获取URL
url = ...
url_queue.put(url)
def save_pic(url_queue):
while True:
url = url_queue.get()
# 判断并创建对应需储存的目录
# with open储存图片
if __name__ == '__main__':
url_queue = Queue()
get_url_process = Process(target=get_url, args=(url_queue,))
get_url_process.start()
save_pic_processes = []
for i in range(4):
p = Process(target=save_pic, args=(url_queue,))
save_pic_processes.append(p)
p.start()
get_url_process.join()
for p in save_pic_processes:
p.join()
这样,get_url()进程就会不断地获取URL并将它们放入队列中,而4个save_pic()进程则会并行地从队列中获取URL并执行save_pic()函数。这样可以提高程序的性能。
看不出来你这应用哪里需要用到多进程,多线程不就足够了吗
你可以将get到的内容先塞进一个全局的list里,然后开个线程池去处理
当然你也可以每个get就直接save,然后多进程执行get
给那个获取url的分配一个线程,然后下载图片(I/O)操作建立个线程池,然后开启获取url的线程,即可解决你的下载速度小于获取速度。