oooooooli 2021-08-11 19:22 采纳率: 0%
浏览 26

python threading保存文件冲突

我写了一个多线程的爬虫,在保存我创建的DataFrame后,发现六个线程只有三个线程的文件保存了,其余都没有保存,是不是存在保存冲突?

这是我的 多线程函数

def thread_run():
    a=threading.Thread(target=crawler_data,args=('id0',))
    b=threading.Thread(target=crawler_data, args=('id1',))
    c=threading.Thread(target=crawler_data, args=('id2',))
    d=threading.Thread(target=crawler_data, args=('id3',))
    e=threading.Thread(target=crawler_data, args=('id4',))
    f=threading.Thread(target=crawler_data, args=('id5',))
    threading_list=[a,b,c,d,e,f]
    for i in threading_list:
        i.start()
    for i in threading_list:
        i.join()
  • 写回答

1条回答 默认 最新

  • I'm float 2021-08-15 14:16
    关注

    我认为要看保存成功的文件是由哪三个线程完成的。
    如果是前3个线程(a,b,c)保存成功,后三个线程(d,e,f)保存失败,那么较大概率是你的这个函数逻辑的问题。由于你的爬虫是在子线程中运行的,那么它不会阻塞主线程的运行,因此很有可能后3个线程刚刚在第1个for循环中被调用start()启动,还没来得及完成保存任务,就在第2个for循环中被调用join()中止了,因此保存失败。
    如果不是,那么应当考虑是否存在冲突,可以用线程锁来解决这个问题。或者是声明一个字符串/字节的IO流对象(在io模块中),在子线程中给这个流对象追加字符,最后在主线程或者最后一个子线程中将IO流的内容写入文件。注意最后要调用close()关闭IO流。
    我这里给一个第一种情况的大致解决方案,没有上机验证,仅供参考。

    def thread_run():
        global done
        done = {0: False, 1: False, 2: False, 3: False, 4:False, 5:False}
        a=threading.Thread(target=crawler_data,args=('id0',))
        b=threading.Thread(target=crawler_data, args=('id1',))
        c=threading.Thread(target=crawler_data, args=('id2',))
        d=threading.Thread(target=crawler_data, args=('id3',))
        e=threading.Thread(target=crawler_data, args=('id4',))
        f=threading.Thread(target=crawler_data, args=('id5',))
        threading_list=[a,b,c,d,e,f]
        for i in threading_list:
            i.start()
        list_ = threading_list.copy()
        while True:
            index = 0
            for i in list_:
                if done[index]:
                    list_.remove(list_.find(i))
                    i.join()
                    continue
            if done[0] and done[1] and done[2] and done[3] and done[4] and done[5]:
                # 所有线程均已结束任务
                break
    
    def crawler_data(arg):
        # 任务
        done[int(arg[2])] = True
    
    评论

报告相同问题?

问题事件

  • 创建了问题 8月11日

悬赏问题

  • ¥15 想问一下树莓派接上显示屏后出现如图所示画面,是什么问题导致的
  • ¥100 嵌入式系统基于PIC16F882和热敏电阻的数字温度计
  • ¥15 cmd cl 0x000007b
  • ¥20 BAPI_PR_CHANGE how to add account assignment information for service line
  • ¥500 火焰左右视图、视差(基于双目相机)
  • ¥100 set_link_state
  • ¥15 虚幻5 UE美术毛发渲染
  • ¥15 CVRP 图论 物流运输优化
  • ¥15 Tableau online 嵌入ppt失败
  • ¥100 支付宝网页转账系统不识别账号