Queue的多线程爬虫和multiprocessing多进程

**Queue的模块里面提供了同步的、线程安全的队列类,包括FIFO(先入后出)队列Queue、FIFO(后入先出)LifoQueue和优先队列PriorityQueue。(在上个文件创建了爬取文件)**我们使用这个方法来获取,代码如下:

python 复制代码
import threading
import requests
import time
import queue as Queue

link_list=[]
with open('alexa.tex','r')as file:
    file_list=file.readlines()
    for eachone in file_list:
        link=eachone.split('\t')[1]
        link=link.replace('\n','')
        link_list.append(link)
start=time.time()
class myThread(threading.Thread):
    def __init__(self,name,q):
        threading.Thread.__init__(self)
        self.name=name
        self.q=q
    def run(self):
        print('Starting'+self.name)
        while True:
            try:
                crawler(self.name,self.q)
            except:
                break
            print('Exiting'+self.name)
def crawler(threadName,q):
    url=q.get(timeout=2)
    try:
        r=requests.get(url,timeout=20)
        print(q.qsize(),threadName,r.status_code,url)
    except Exception as e:
        print(q.qsize(),threadName,url,'Error:',e)


aii_list=['Thread-1','Thread-2','Thread-3','Thread-4','Thread-5']

workQueue=Queue.Queue(1000)
thread=[]

#建立新的线程
for thName in aii_list:
    thread=myThread(thName,workQueue)
    thread.start()
    aii_list.append(thread)

#填充列表
for i in link_list:
    workQueue.put(link_list)

#结束线程
for t in thread:
    thread.join()

end=time.time()
print('当前的总时间:',end-start)
print('Exiting')

对象传入myThread中;

thread = myThread(tName,workQueue)

使用一个for循环来实现:

for url in link_list=:

work.Queue.put(url)

多进程:

使用multiprocess库有两种方法:1.Process+Queue的方法 2.Pool+Queue的方法

我们因先了解计算机的cpu的核心:

python 复制代码
from multiprocessing import cpu_count
print(cpu_count())

然后代码示例:

python 复制代码
from multiprocessing import Process,Queue
import requests
import time


link_list=[]
with open('alexa.tex','r')as file:
    file_list=file.readlines()
    for eachone in file_list:
        link=eachone.split('\t')[1]
        link=link.replace('\n','')
        link_list.append(link)
start=time.time()
class myProcess(Process):
    def __init__(self,q):
        Process.__init__(self)
        self.q=q
    def run(self):
        print('Starting'+self.name)
        while True:
            try:
                crawler(self.name,self.q)
            except:
                break
            print('Exiting'+self.name)
def crawler(q):
    url=q.get(timeout=2)
    try:
        r=requests.get(url,timeout=20)
        print(q.qsize(),r.status_code,url)
    except Exception as e:
        print(q.qsize(),url,'Error:',e)

if __name__ == '__main__':
    ProcessNames=['prcess1','prcess2','prcess3']
    workQueue=Queue(1000)
    
    for url in link_list:
        workQueue.put(url)
        
    for i in range(0,3):
        p=myProcess(workQueue)
        p.daemon=True
        p.start()
        p.join()
            
    end=time.time()
    print('当前的总时间:',end-start)
    print('Exiting')

与多线程相比多进程相比,多进程里面设置了:(当父进程结束后,子进程就会自动被终止)

p.daemon=Ture

并且multprocessing自带了Queue

相关推荐
2401_841495641 分钟前
【LeetCode刷题】二叉树的层序遍历
数据结构·python·算法·leetcode·二叉树··队列
roman_日积跬步-终至千里5 分钟前
【Java并发】Java 线程池实战:警惕使用CompletableFuture.supplyAsync
java·开发语言·网络
lsx20240610 分钟前
C++ 基本的输入输出
开发语言
ZH154558913111 分钟前
Flutter for OpenHarmony Python学习助手实战:GUI桌面应用开发的实现
python·学习·flutter
B站计算机毕业设计超人17 分钟前
计算机毕业设计Hadoop+Spark+Hive招聘推荐系统 招聘大数据分析 大数据毕业设计(源码+文档+PPT+ 讲解)
大数据·hive·hadoop·python·spark·毕业设计·课程设计
B站计算机毕业设计超人18 分钟前
计算机毕业设计hadoop+spark+hive交通拥堵预测 交通流量预测 智慧城市交通大数据 交通客流量分析(源码+LW文档+PPT+讲解视频)
大数据·hive·hadoop·python·spark·毕业设计·课程设计
CodeSheep程序羊22 分钟前
拼多多春节加班工资曝光,没几个敢给这个数的。
java·c语言·开发语言·c++·python·程序人生·职场和发展
独好紫罗兰23 分钟前
对python的再认识-基于数据结构进行-a002-列表-列表推导式
开发语言·数据结构·python
机器学习之心HML26 分钟前
多光伏电站功率预测新思路:当GCN遇见LSTM,解锁时空预测密码,python代码
人工智能·python·lstm
2401_8414956428 分钟前
【LeetCode刷题】二叉树的直径
数据结构·python·算法·leetcode·二叉树··递归