day9-Python学习笔记(二十二)多线程,多进程

多线程,多进程

多线程:
咱们打开的程序都一个进程。
线程是包含在进程里的。
进程里面最少有一个线程
线程之间是互相独立的
主线程

cpu是几核的,就只能同时运行几个进程

python的多线程是利用不了多核cpu的,GIL 全局解释器锁的
如果想利用多核cpu的话,就是用多进程

I0密集型任务
使用io比较多的 多线程
cpu密集型任务
多进程 能使用多核cpu
使用cpu比较多的

多线程.py

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)

for t in threads: #等待3个子线程
t.join() #主线程等待子线程

end_time = time.time()
print(end_time-start_time)

# start_time = time.time()
# for url in urls:
# downHtml(url[1],url[0])
# end_time = time.time()
# print(end_time-start_time)
# for i in range(10):
# t = threading.Thread(target=sayHi,args=('小黑',)) #启动线程
# t.start()#运行

多线程2.py
import threading
urls = list(range(100))
# 100个 启动5个线程
def p(urls):
for u in urls:
print(u)

for i in range(5):
# urls[:20] 每次取的值
# urls[20:40]
# urls[40:60]
# urls[60:80]
# urls[80:]
t = threading.Thread(target=p,args=())
t.start()

守护线程.py
import threading
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')

# 进程快
# 还是线程快
 
#如果多线程执行的函数 想获取到结果的话,那么就得把它的结果写到一个list里面
res = []
import requests
def lida(x,y):
res.append(x+y)
import threading
for i in range(5):
t = threading.Thread(target=lida,args=(i,i))
t.start()
print(res)

线程锁
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)

#加锁是为了多线程的时候同时修改一个数据的时候 有可能会导致数据不正确

#python3里面锁 你不加也无所谓,它会自动的给你加上锁

多进程.py
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()



原文地址:https://www.cnblogs.com/flynn0825/p/8536995.html