Python多线程爬虫结束不了子进程问题解决
2021/10/5 7:14:44
本文主要是介绍Python多线程爬虫结束不了子进程问题解决,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
对于python多线程爬虫,使用multiprocessing
能有效的帮我们实现多线程的任务,如以下代码所示,这段代码看似没有什么毛病,但真正执行起来时,有时程序能正常的退出,但大多数情况下是不能正常的退出,程序一直处于阻塞的状态
def Producer(in_q,url,type): response = http.request('GET', url, headers=header) result = response.data.decode('UTF-8') jsonData = json.loads(result) print('%s---%s'%(type,jsonData["data"]["total"])) for item in jsonData["data"]: item['f0']=type item['f-1']=0 in_q.put(item) return def Consumer(in_q): item=None try: while in_q.empty() is not True: item=in_q.get() Handle_Stock(item) in_q.task_done() return except Exception as e: print(e) #补偿重试1次 if item['f-1']==0: item['f-1']=1 in_q.put(item) in_q.task_done() return def Handle(item): if not isExist: mysql.insert() else: mysql.update() def Multithreading_Get(): start=time.time() pool=multiprocessing.Pool(16) queue=multiprocessing.Manager().Queue() params=[{'type':1,'param':'m:1+t:2'},{'type':2,'param':'m:0+t:6'},{'type':3,'param':'m:1+t:23'},{'type':4,'param':'m:0+t:80'}] for item in params: url='localhost://fields=f38,f39,f12,f14' Producer(queue,url,item['type']) print('QueueSize: %s'%queue.qsize()) for i in range(100): pool.apply_async(Consumer,args=(queue,)) print('主线程over') pool.close() #阻止后续任务提交到进程池,当所有任务执行完成后,工作进程会退出 pool.join() #等待工作进程结束。调用join前,必须close queue.join() end=time.time() print('总耗时:%s'%(end-start))
问题是出在Consumer()这个方法里,这个方法主要是消费,in_q.get()是从队列里取出对应数据
通过文档可以看出这个方法默认是开启阻塞的,当多个线程同时进入Consumer这个方法里时,都去进行get()这个操作时,必然有线程不会执行成功,而是一直阻塞在这里,所以程序就一直不能结束了
解决方案
如文档所示,get()可以对其设置一个超时时间或者关闭默认的阻塞模式
这篇关于Python多线程爬虫结束不了子进程问题解决的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-20Python编程入门指南
- 2024-12-20Python编程基础与进阶
- 2024-12-19Python基础编程教程
- 2024-12-19python 文件的后缀名是什么 怎么运行一个python文件?-icode9专业技术文章分享
- 2024-12-19使用python 把docx转为pdf文件有哪些方法?-icode9专业技术文章分享
- 2024-12-19python怎么更换换pip的源镜像?-icode9专业技术文章分享
- 2024-12-19Python资料:新手入门的全面指南
- 2024-12-19Python股票自动化交易实战入门教程
- 2024-12-19Python股票自动化交易入门教程
- 2024-12-18Python量化入门教程:轻松掌握量化交易基础知识