python并行编程—python利用生产者消费者模型进行多线程爬虫操作
来源:互联网 发布:c语言判断正负 while 编辑:程序博客网 时间:2024/05/23 16:17
生产者消费者模式爬韩寒博客,并用文章名保存
思路:有意识的把download 模块和生产者消费者模块独立。避免他们相互依赖的关系!
downloading模块:
# coding:gbkimport urllib.requestimport reimport osdef getUrlData(url): try: response = urllib.request.urlopen(url) except Exception as e: print(e) return response.read().decode('utf-8')def getArticleUrlList(url,isOpenmutipThread=False,queue=None): #得到某个url的文章列表,并返回列表,如果这个方式是多个线程开启,请将第二个参数设置成True,并传入队列 data = getUrlData(url) reStr=r'<a title(.*?)href="(.*?)">(.*?)</a>' ls_data =re.findall(reStr,data) #for each in ls_data: # print(each) if isOpenmutipThread and queue!=None: queue.put(ls_data) return None else: return ls_data def DownOnePage(url,filename,mutex): #print(filename,1) data = getUrlData(url) with open('data_html\\'+filename+'.html','w') as f: try: with mutex: f.write(data) except: print(filename+u'不符合文件名创建要求')def main(): #os.mkdir('data_html') url = 'http://blog.sina.com.cn/s/articlelist_1191258123_0_1.html' ls_data = getArticleUrlList(url) #ls_data[0] =('',ls_data[0][1],'empty') i = 0 for each in ls_data: #print(each[1],each[2]) DownOnePage(each[1],each[2]) i+=1if __name__=='__main__': #main() pass生产者消费者模型:
# coding:gbkimport threading import downloadimport queueimport osmutex = threading.Lock()exit_mutex = threading.Lock()class Producer(threading.Thread): def __init__(self,q,fnProducer,*args): super().__init__() self.q = q self.fnProducer =fnProducer self.args= args def run(self): data = self.fnProducer(self.args[0]) #print(self.args[0]) self.q.put(data)class Consumer(threading.Thread): def __init__(self,q,fnConsumer,*args): super().__init__() self.q = q self.fnConsumer =fnConsumer self.args= args def run(self): while True: try: data = self.q.get(block=False) except queue.Empty: if exit_mutex.locked(): #raise StopIteration break else: for each in data: self.fnConsumer(each[1],each[2],mutex)def main(): q = queue.Queue() ls_producer=[] ls_consumer=[] for i in range(7): url = 'http://blog.sina.com.cn/s/articlelist_1191258123_0_'+str(i+1)+'.html' p =Producer(q,download.getArticleUrlList,url) p.start() ls_producer.append(p) for i in range(7): p = Consumer(q,download.DownOnePage) p.start() ls_consumer.append(p) for each in ls_producer:#等待所有生产者线程结束 each.join() exit_mutex.acquire()#设置获得退出锁 for each in ls_consumer: each.join()#等待所有的线程结束 exit_mutex.release()#释放退出锁 #等到所有结束后 if __name__=='__main__': main()
0 0
- python并行编程—python利用生产者消费者模型进行多线程爬虫操作
- Python--多线程编程--生产者消费者模型
- Python 多线程 生产者消费者模型
- python生产者消费者模型
- Python学习 多线程编程 生产者-消费者问题
- Python 生产者与消费者模型
- python生产者消费者简单模型
- python用于实现多线程异步交互之生产者消费者模型
- 利用python实现生产者消费者的并发模型
- 利用python线程编程实现生产者与消费者关系
- Java多线程编程核心技术——生产者消费者模型
- 多线程编程之生产者和消费者模型
- 多线程---生产者-消费者模型
- 生产者消费者模型-python-多进程
- 生产者消费者模型-python-多进程
- 消费者&生产者模型的python代码
- python线程和进程,生产者消费者模型
- Python多线程学习(三、生产者与消费者)
- QTP自动化测试之VBScript基础(上)
- ertuyr6etw
- C++之容器
- QTP自动化测试之VBScript基础(下)
- LINK : fatal error LNK1181: cannot open input file ‘xxx.obj’
- python并行编程—python利用生产者消费者模型进行多线程爬虫操作
- git 使用详细步骤
- 一步步学习编写程序
- github--摸石过河的记录
- JAVA程序员成长之路的总结
- QTP自动化测试之VBScript对象
- (2015)北京区域赛总结+回忆录
- Apache 大三方法HTTP请求链接响应之HttpClient的GET和POST工具类封装
- android 点击事件分发总结