python并行编程—python利用生产者消费者模型进行多线程爬虫操作

原创 2015年11月20日 00:28:58

生产者消费者模式爬韩寒博客,并用文章名保存

思路:有意识的把download 模块和生产者消费者模块独立。避免他们相互依赖的关系!

downloading模块:

# coding:gbk
import urllib.request
import re
import os
def 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+=1
if __name__=='__main__':
    #main()
    pass
生产者消费者模型:
# coding:gbk
import threading 
import download
import queue
import os
mutex = 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()



python:多线程+队列Queue 实现:生产者和消费者demo

# -*- coding: UTF-8 -*- # __author__ = 'Sengo' import Queue import threading import time class Boo...
  • Sengo_GWU
  • Sengo_GWU
  • 2017年04月26日 14:55
  • 545

谈谈我对Linux下“生产者/消费者线程模型”的理解

生产者消费者线程模型常常用于网络编程,即一个线程监听事件发生(生产者,例如产生“收到数据”事件),其他线程来处理事件(消费者,例如处理收到的数据)比较笨的办法是: 消费者线程不停地loop等待数据,...
  • xocoder
  • xocoder
  • 2016年03月23日 15:39
  • 1504

通过“生产者-消费者模型”理解Python协程和yield关键字

最近学习廖老师的Python3教程,关于协程那块讲得不是很详细,相信很多人像我一样看不懂,经过研究终于弄懂了,现在把学习成果分享给大家。 首先看看教程中提到的经典”生产者-消费者“模型,传统的解决方...
  • sunflowerduidui
  • sunflowerduidui
  • 2016年07月04日 12:39
  • 1702

一个python写的生产者(Producer)和消费者(Consumer)问题

如题,以下代码为一个使用python写的生产者和消费者,可直接拷贝运行! 程序这样设定的: 1 有个Box 类,如果flag设置为Fasle,则表示Box里没有content,否则表示Box里有c...
  • u012208403
  • u012208403
  • 2015年04月13日 17:05
  • 475

Qt之线程同步(生产者消费者模式 - QSemaphore)

简述生产者将数据写入缓冲区,直到它到达缓冲区的末尾,这时,它从开始位置重新启动,覆盖现有数据。消费者线程读取数据并将其写入标准错误。Semaphores 使得比 mutexes 有一个更高级的并发性成...
  • u011012932
  • u011012932
  • 2016年09月23日 16:33
  • 4127

多线程模拟实现生产者/消费者模型

题目如下:       在生产者/消费者模型中,生产者Producer负责生产数据,而消费者Consumer负责使用数据。多个生产者线程会在同一时间运行,生产数据,并放到内存中一个共享的区域。期间,...
  • u013310119
  • u013310119
  • 2016年08月25日 14:51
  • 1028

python生产者/消费者示例

Python多线程实现生产者/消费者模式。
  • dutsoft
  • dutsoft
  • 2017年01月24日 23:10
  • 573

C++多线程学习:生产者消费者问题

多线程相关知识点: C++11 线程库:http://zh.cppreference.com/w/cpp/thread 互斥量和锁 std::unique_lock::lock 和 std::uni...
  • quzhongxin
  • quzhongxin
  • 2015年08月19日 20:56
  • 5542

Java 多线程学习之生产者消费者模型:一个较完善的实现

生产者、消费者模型是学习多线程的时候的一个很好的练习模型。该问题专业的说法应为:有限缓冲问题。该问题描述了两个共享固定大小缓冲区的线程——即所谓的“生产者”和“消费者”——在实际运行时会发生的问题。 ...
  • a454042522
  • a454042522
  • 2013年02月08日 20:31
  • 1845

Java多线程编程核心技术——生产者消费者模型

生产者消费者模型是并发中的经典问题,具体场景是有一块缓冲区作为仓库,生产者可以向其添加产品,消费者可以从中取出产品。解决生产者消费者问题可以采用两种方式:wait()/notify方式和Blockin...
  • ghz_blog
  • ghz_blog
  • 2017年02月28日 10:46
  • 309
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:python并行编程—python利用生产者消费者模型进行多线程爬虫操作
举报原因:
原因补充:

(最多只允许输入30个字)