线程池的问题

线程池的问题

if __name__ == '__main__':
   yier =YnerSpider()
   exector = ThreadPoolExecutor()
   lst =yier.start_requests()
   for item in lst:
       exector.submit(yier.parse, item)
定义了一个类,继承object, 在不用线程的情况下可以正常运行,像这样使用线程,lst列表长度是9,运行一半就停止了,没有结果是怎么回事,又不报错,上面这个写法,只有是线程池1个,而且for循环一次就break才能正常运行,相当于不用线程。 难道说不继承Thread的类就不能使用线程去调用它的方法?

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
提问者 weixin_慕UI515575 2020-03-19 11:46:26

上面的线程问题已解决,for循环里面吧线程添加到一个列表,for循环结束后wait这个列表就可以运行了。现在又有下面进程的问题

if __name__ == '__main__':
   yier =YnerSpider()
   lst =yier.start_requests()
   pool = Pool(5)
   for item in lst:
       pool.apply(func= yier.parse,args=(item,))
   pool.close()
   pool.join()

这样用多进程报错(在pool.apply报错),也用不了,同样的代码,如果pool.apply执行的函数另外单独定义一个,又是可以运行的。

p = Process(target=yier.parse, args=(lst[0],))
p.start()
p.join()

用一个进程也报错(这里在p.start()报错),同样的把target执行的函数换成一个自定义函数又是正常的了

  • 同学,你好。同学可以提供代码及报错提示,只说报错无法确定具体问题。此案例可能是同学给线程池传入的函数出现了问题,同学自定义函数是否有定义了一个参数,而实例方法parse中是不是除了self以外没有其他的形参?exector.submit(yier.parse, item)、pool.apply(func= yier.parse,args=(item,))和Process(target=yier.parse, args=(lst[0],))代码都有给yier.parse传参数,请同学先确定yier.parse方法是否有除了self以外还有一个参数,然后再次尝试。 如果解决了你的疑惑,请采纳,祝学习愉快~
    2020-03-19 13:40:37
  • 除了self还有个参数,不然就不用args传参了,线程可以用,用进程就不行了
    2020-04-11 16:30:32
  • 同学,你好。老师这边根据你的描述写出来的代码时没有问题的,请同学将代码附上再次提问,会安排老师帮你解决的。 祝学习愉快~
    2020-04-13 11:24:39
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
1.Python零基础入门
  • 参与学习           人
  • 提交作业       2727    份
  • 解答问题       8160    个

想要进入Python Web、爬虫、人工智能等高薪领域,你需要掌握本阶段的Python基础知识,课程安排带你高效学习轻松入门,学完你也能听得懂Python工程师的行业梗。

了解课程
请稍等 ...
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师