double07 发表于 2021-5-17 11:42

pyhton多线程处理的错误?

本帖最后由 double07 于 2021-5-17 12:12 编辑

使用concurrent.futures遇到两个问题:
1.单线程下载某一链接图片,每张图片名称均能按1/2/3/4/5命名并顺序保存。但多线程后图片名称保存名称错乱2/48/75/35/80,怎样在多线程下,使每个链接中图片命名方式顺序保存?
2.多线程下载的文件不完整,图片有5张,但部分链接只能下4张或更少,代码使用错误?
import os,re,time,chardet,threading,requests
from lxml import etree
from concurrent.futures import ThreadPoolExecutor
p = 0
num = 0
pa = 0
n = 0
curPage = 2
data_list = []

def download_picture(u):    #下载图片
    global pa, p, n
    html_detail = gethtml_detail(u)
    html = etree.HTML(html_detail)
    try:
      picsrc_list = re.findall(r'data-ks-lazyload="(//[^\s]*)"', html_detail)
      folder_name = html.xpath('//*[@class="pm-main clearfix"]/h1/text()').strip()
    except Exception as e:
      print(str(e), "无图片")
      folder_name = html.xpath('//*[@class="pm-main clearfix"]/h1/text()').strip()
      os.makedirs('./Pictures and videos/' + folder_name, exist_ok=True)
      pa += 1
      return
    path = 'C:/Users/Administrator/Desktop/Python/AL-SF/Pictures and videos/'
    if os.path.exists(path + folder_name + '/' + str(n) + '.jpg') != True:
      time_start = time.time()
      os.makedirs('./Pictures and videos/' + folder_name,exist_ok=True)# makedirs()里两个参数:第一个是所要创建的文件夹名称,第二个是当文件夹已经存在时不采取其他操作
      n = 0
      for picsrc in picsrc_list:
            n = n + 1
            pic_src = 'https:' + picsrc
            picsrc_resp = requests.get(pic_src)
            with open(os.path.join('./Pictures and videos/' + folder_name, str(n) + '.jpg'),'wb') as f:# os.path.join()第一个参数是文件夹名称,第二个是要保存文件的名称,记得加上格式后缀。图片,视频,影音基本都是’wb’
                f.write(picsrc_resp.content)
                f.close()
                time.sleep(1)
      time_end = time.time()
      print('第%s页第%s条房产图片已保存!====用时%.1f秒' % (p, pa + 1,(time_end - time_start)))
      pa += 1

    else:
      print('图片重复', '第%s页第%s条房产图片已保存!' % (p, pa + 1))
      pa += 1
    return

def download_video(u):    #下载视频
   省略……



def run_AL():
    global p
    for i in url_list:
      html = gethtml(i)
      llist = parse_url(html) #获取第一页详情页链接
      with ThreadPoolExecutor(40) as t:
            for u in llist:
                t.submit(download_picture,u)

if __name__ == '__main__':
    run_AL()

keate23 发表于 2021-5-17 13:36

你是下载时已经命名,而不是完成后命名。

kof21411 发表于 2021-5-17 13:45

1,python多进程默认不能共享全局变量
2,我看你要集采的url图片应该是采用了懒加载模式,所以你从源码里是有可能采不到五张图片的

double07 发表于 2021-5-17 14:16

kof21411 发表于 2021-5-17 13:45
1,python多进程默认不能共享全局变量
2,我看你要集采的url图片应该是采用了懒加载模式,所以你从源码里 ...

第一个问题卡了几天,大佬一句话搞{:1_921:}。对于第二个下载不全的问题,有解决方案?大佬

Cool_Breeze 发表于 2021-5-17 14:19

线程之间共享资源需要线程锁来保护资源(n = n + 1, pa += 1)

缘来画中人 发表于 2021-5-17 15:35

哎 python的设计缺陷,烦死了。
页: [1]
查看完整版本: pyhton多线程处理的错误?