#多线程,多进程
#进程:资源单位,线程:执行单位,每一个进程至少要有一个线程
#启动一个程序默认都会有一个主线程
#多线程
#第一套写法
'''from threading import Thread
def func():
for i in range(1000):
print('func',i)
t=Thread(target=func)#创建线程并给线程安排任务
t.start()#开始执行该线程,多线程状态为可以开始工作状态,具体的执行时间由cpu决定
t2=Thread(xxx)
t2.start()
for i in range(1000):
print('main', i)'''
from threading import Thread
class MyThread(Thread):#子类继承父类
def run(self):#固定的,当线程被执行的时候,被执行的就是run()
for i in range(1000):
print('子线程',i)
t=MyThread()
#t.run()#方法调用会是单线程
t.start()#开启线程
for i in range(1000):
print('主线程', i)
#多进程
from multiprocessing import Process
from threading import Thread
'''def func():
for i in range(1000):
print('子进程',i)
if __name__ == '__main__':
p=Process(target=func)
p.start()
for i in range(1000):
print('主进程', i)
class MyProcess(Process):#子类继承父类
def run(self):#固定的,当线程被执行的时候,被执行的就是run()
for i in range(1000):
print('子进程',i)
if __name__ == '__main__':
p=MyProcess()
p.start()
for i in range(1000):
print('主进程', i)
def func(name):#传递参数怎么传递
for i in range(1000):
print(name,i)
if __name__ == '__main__':
t1=Thread(target=func,args=('周杰伦',))#传参必须是元组
t1.start()#开始执行该线程,多线程状态为可以开始工作状态,具体的执行时间由cpu决定
t2 = Thread(target=func,args=('王力宏',))
t2.start()
'''
#线程池:一次性开辟一些线程,我们用户直接给子线程池提交任务,线程任务的调度交给线程池来完成
#50 10000
from concurrent .futures import ThreadPoolExecutor,ProcessPoolExecutor
def fn(name):
for i in range(1000):
print(name,i)
if __name__=='__main__':
#创建50个线程的线程池
with ThreadPoolExecutor(50) as t:
for i in range(100):
t.submit(fn,name=f'线程{i}')
#with会等待线程池中的任务全部执行完毕才继续执行
print('123')
#如何提取单个页面的数据
#上线程池,多个页面同时抓取
import requests
from concurrent .futures import ThreadPoolExecutor,ProcessPoolExecutor
from lxml import etree
def download_one_page(prodcatid):
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36'}
#拿到页面源代码
url='http://www.xinfadi.com.cn/getCat.html'
data= {
'prodCatid': prodcatid
}
resp=requests.post(url,data,headers)
resp.encoding='utf-8'
result=resp.text
#把数据存放在文件中
filename = "p"+str(prodcatid)+ '.txt'
with open(filename, 'w', encoding='utf-8') as fp:
fp.write(result)
print(url,'提取完毕')
if __name__=='__main__':
#download_one_page('http://www.xinfadi.com.cn/getCat.html')
#创建线程池
with ThreadPoolExecutor(50) as t:
for i in range(1186,1204):
#把下载任务提交给线程池
t.submit(download_one_page,i)
print(i,'完毕')