# 多线程:
# 咱们打开的程序都一个进程。
# 线程是包含在进程里的。
# 进程里面最少有一个线程
# 线程之间是互相独立的
# 主线程
#
# cpu是几核的,就只能同时运行几个进程
#
# python的多线程是利用不了多核cpu的,GIL 全局解释器锁的
# 如果想利用多核cpu的话,就是用多进程
#
# I0密集型任务
# 使用io比较多的 多线程
# cpu密集型任务
# 多进程 能使用多核cpu
# 使用cpu比较多的
import threading
import time
import requests
def downHtml(url,name):
conent = requests.get(url).content
f = open(name+'.html','wb')
f.write(conent)
f.close()
urls = [
['nnzhp','http://www.nnzhp.cn'],
['dsx','http://www.imdsx.cn'],
['besttest','http://www.besttest.cn']
]
start_time = time.time()
threads = [] #存放刚才启动线程
for url in urls:
t = threading.Thread(target=downHtml,args=(url[1],url[0]))
t.start()
threads.append(t)
# 线程等待,多线程在运行的时候,每个线程都是独立运行的,不受其他的线程干扰,如果想在哪个线程运行完之后,再做其他操作的话,就得等待它完成,那怎么等待呢,使用join,等待线程结束
for t in threads: #等待3个子线程
t.join() #主线程等待子线程
end_time = time.time()
print(end_time-start_time)
#多进程,上面说了Python里面的多线程,是不能利用多核CPU的,如果想利用多核CPU的话,就得使用多进程,python中多进程使用multiprocessing模块。
import multiprocessing,threading
import time
def run2():
print('这是多线程启动的')
def run():
time.sleep(2)
for i in range(5):
t = threading.Thread(target=run2)
t.start()
if __name__ == '__main__':
for i in range(5):
p = multiprocessing.Process(target=run)
p.start()
#线程锁,线程锁就是,很多线程一起在操作一个数据的时候,可能会有问题,就要把这个数据加个锁,同一时间只能有一个线程操作这个数据
#加锁是为了多线程的时候同时修改一个数据的时候 有可能会导致数据不正确
#python3里面锁 你不加也无所谓,它会自动的给你加上锁
import threading
from threading import Lock
num = 0
lock = Lock() # 申请一把锁
def run():
global num
lock.acquire() # 加锁
num += 1
lock.release() # 解锁
lis = []
for i in range(5):
t = threading.Thread(target=run)
t.start()
lis.append(t)
for t in lis:
t.join()
print('over', num)
#守护线程,什么是守护线程呢,就相当于你是一个国王(非守护线程),然后你有很多仆人(守护线程),这些仆人都是为你服务的,一但你死了,那么你的仆人都给你陪葬。
import time
def pz():
time.sleep(2)
print('我是秦始皇的陪葬')
threads = []
for i in range(10):
t = threading.Thread(target=pz)
t.setDaemon(True)#设置子线程为守护线程
# 守护线程就是,一旦主线程执行结束,那么子线程立刻结束,不管子线程有没有运行完
t.start()
threads.append(t)
for t in threads:
t.join() #如果主线程等待子线程的话,那么设置的守护线程就不好使了
print('done')