weixin_59094960 2022-08-22 15:00 采纳率: 55.6%
浏览 53
已结题

并行多线程失败,怎么弄

问题遇到的现象和发生背景

我要从网上爬取数据并写入本地文件,但是运行过程中发现并没有并行处理,而是一个一个串行运行。请问代码哪里写得不对?
我的CPU是Core i5-7400,系统是win7 64位的,用pycharm写的代码。
还有一个问题请教,就是 with Pool(processes=4) as pool 这一句,processes一般取多大的数值合适?

问题相关代码,请勿粘贴截图
from multiprocessing.pool import Pool

def updateStock_pool_per(arg_list):
    download_url = arg_list[0]
    stock_path=arg_list[1]
    stock_code=arg_list[2]
    df = pd.read_csv(download_url, encoding='gbk')  # 直接将网上的文件数据读取下来
    path = os.path.join(stock_path, stock_code + '.csv')
    df.to_csv(path, index=False, encoding='gbk') # 保存到文件
    return stock_code

def updateStock(stock_path,stock_code_list):
    arg_list = []
    for stock_code in stock_code_list:
        download_url = 'http://quotes.money.163.com/service/chddata.html?code=' + stock_code + '&start=20220719&end=20220819&fields=TCLOSE;HIGH;LOW;TOPEN;LCLOSE;VOTURNOVER;VATURNOVER;TCAP;MCAP' # 构造url
        list_ = [download_url, stock_path, stock_code]
        arg_list.append(list_)

        # pool 每组参数只有一个,多参数封装list中list传入
        with Pool(processes=4) as pool:  # 看你的电脑硬件能支持多少线程
            # 使用并行批量获得DataFrame的一个列表
            update_success_list = pool.map(updateStock_pool_per, arg_list)# 返回是个list
        print('*' * 50)
        update_all_count = len(stock_code_list) # 一共需要更新的股票数量
        update_success_count = len(update_success_list)

        update_fail_list = []
        for m in stock_code_list:
            if m not in update_success_list:
                update_fail_list.append(m)
        update_fail_count = len(update_fail_list)
        print('共准备更新 {} 支股票, {} 支股票增加数据, {} 支股票下载数据有错'.format(update_all_count, update_success_count, update_fail_count))
        if update_fail_list:
            print(f'下载以下股票时出错\n{update_fail_list}')

if __name__ == '__main__':
    stock_path = r'C:\Users\Administrator\Desktop\stock'
    stock_code_list = ['1002296','1002364','1000826','0600981','1000997','1000901','1300291','1300002','1002051','1300252']
    updateStock(stock_path,stock_code_list)

运行结果及报错内容

img

我想要达到的结果

请告诉我问题出在哪里,该怎样修改代码

  • 写回答

3条回答 默认 最新

  • 天元浪子 Python领域优质创作者 2022-08-22 16:01
    关注
    1. 这是多进程而不是多线程
    2. 从19行到34行,不应该在for循环体内,应该与for循环平级,否则就是在不断地创建和销毁进程池,结果啥也干不成
    3. 进程数原则上是CPU核数的整数倍,不过倒也不必受此约束,主要看计算瓶颈或IO瓶颈在哪儿
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 8月30日
  • 已采纳回答 8月22日
  • 赞助了问题酬金5元 8月22日
  • 创建了问题 8月22日

悬赏问题

  • ¥15 c语言怎么用printf(“\b \b”)与getch()实现黑框里写入与删除?
  • ¥20 怎么用dlib库的算法识别小麦病虫害
  • ¥15 华为ensp模拟器中S5700交换机在配置过程中老是反复重启
  • ¥15 java写代码遇到问题,求帮助
  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看
  • ¥15 关于#Java#的问题,如何解决?