python多线程,多进程
进程;一个进程就是一个程序
线程:线程是进程里最小的执行单元,线程是在进程里面
一个进程里面最少有一个线程,可以有多个线程
线程之间是相互独立的
没有真正意义上的并发,电脑的cpu是几核的最多只能同时运行几个进程
python里面的多线程是利用不了多核cpu的,只能利用一个核心的cpu
多进程是可以利用多核cpu的
有些情况下,多线程比单线程还要慢
多线程适用于io密集型任务
磁盘io input output存取数据
网络io
多进程适用于cpu密集型任务
GIL全局解释器锁
等待子线程的方法:
(1)
import threading,time
all_res=[]#用来存储返回值的
def run(name):
time.sleep(5)
print('[%s]哈哈哈'%name)
all_res.append(name)
# for i in range(5):#串行
# run()
#t1=threading.Thread(target=run)#线程,target=只传函数名
#t1.start()
start_time=time.time()
for i in range(10):#还有一个主线程,共有11个线程在工作,先统一启动所有的子线程
t1=threading.Thread(target=run,args=(i,))#如果有参数时,写到args里,有一个参数时后面要加逗号
t1.start()
#方法一
while threading.active_count()!=1:#判断当前活跃的线程数是几个,如果是1的话说明子线程已经执行完了
pass
end_time=time.time()
# time.sleep(10)
print(end_time-start_time)
print(all_res)
(2)
import threading,time
all_res=[]#用来存储返回值的
def run(name):
time.sleep(5)
print('[%s]哈哈哈'%name)
all_res.append(name)
start_time=time.time()
# 方法二
threads=[]#存放所有的子线程
for i in range(10):#还有一个主线程,共有11个线程在工作,先统一启动所有的子线程
t1=threading.Thread(target=run,args=(i,))#如果有参数时,写到args里,有一个参数时后面要加逗号
threads.append(t1)
t1.start()
for t in threads:#统一去等待子线程执行结束
t.join()
end_time=time.time()
print(end_time-start_time)
print(all_res)
查看当前线程
def run(name):
print('子线程',threading.current_thread())#查看当前线程
time.sleep(20)
print('[%s]哈哈哈'%name)
all_res.append(name)
守护线程
守护线程就是和秦始皇陪葬的人一样
主线程就是秦始皇
子线程就是陪葬的人
import threading,time
def run():
time.sleep(5)
print('run..')
for i in range(10):
t=threading.Thread(target=run)
t.setDaemon(True)#设置子线程为守护线程
t.start()
print('over...')
锁:
import threading
from threading import Lock
num=0
lock=Lock()#实例化一把锁
def run():
global num
# lock.acquire()#加锁
#num+=1
# lock.release()#解锁
with lock:#自动加锁解锁
num+=1
for i in range(100):
t=threading.Thread(target=run)
t.start()
while threading.active_count()!=1:
pass
print(num)
线程池
import threadpool,requests
all_qq=['102679186','64310953']
url='http://q4.qlogo.cn/g?b=qq&nk=%s&s=140'
def down_img(qq_num):
res=requests.get(url%qq_num).content
with open('%s.jpg'%qq_num,'wb') as fw:
fw.write(res)
pool=threadpool.ThreadPool(50)#线程池的大小
all_requests = threadpool.makeRequests(down_img,all_qq)#分配数据
for r in all_requests:
pool.putRequest(r)#发请求
pool.wait()#等待所有线程运行完
print('done 下载完成')
多进程/进程池
from multiprocessing import Process,Pool
import requests
all_qq=['102679186','64310953']
url='http://q4.qlogo.cn/g?b=qq&nk=%s&s=140'
def down_img(qq_num):
res=requests.get(url%qq_num).content
with open('%s.jpg'%qq_num,'wb') as fw:
fw.write(res)
if __name__=='__main__':
# for qq in all_qq:
# p=Process(target=down_img,args=(qq,))
# p.start()
pool=Pool(5)#指定进程池的大小
list(pool.map(down_img,all_qq))#运行