什么是全局解释锁
import dis
# 反编译 将函数变成字节码的流程
def tony(t):
t = t+1
return t
print(dis.dis(tony))
什么是GIL
全局解释锁
一个线程对应于C语言中的一个线程
1.Python在多线程中为什么有人会觉得它慢?
字节码
使得同一时刻只能有一个线程在一个CPU上面执行字节码
pypy
gil在某些情况下是可以被释放掉的:
1.gil会根据执行的字节码行数以及时间片进行释放gil
2.程序会在遇到io操作的时候 主动释放
宏观上讲可以同时打开多个应用程序
时间片的轮回算法
a = 0
def time():
'''
1. thread_001
2. io操作 没想象中那么严,会主动释放的
3. thread_002
:return:
'''
global a # LEGB
for item in range(1000000):
a += 1
def test():
global a
for item in range(1000000):
a -= 1
import threading
thread_1 = threading.Thread(target=time)
thread_2 = threading.Thread(target=test)
thread_1.start()
thread_2.start()
thread_1.join()
thread_2.join()
print(a)
threading多线程-守护线程
class GetDataHtml(threading.Thread):
def __init__(self,name):
super().__init__(name=name)
def run(self):
print('开始获取数据html的时间')
time.sleep(2)
print('获取数据html结束的时间')
class GetDataUrl(threading.Thread):
def __init__(self,name):
super().__init__(name=name)
def run(self):
print('开始获取数据url的时间')
time.sleep(2)
print('获取数据url结束的时间')
if __name__ == '__main__':
thread_one=GetDataHtml('tony')
thread_two=GetDataUrl('老师')
start_time = time.time()
thread_one.start()
thread_two.start()
# print("中间运行时间:{}".format(time.time()-start_time))
# 阻塞
thread_one.join()
thread_two.join()
print("中间运行时间:{}".format(time.time()-start_time))
线程间的通讯-共享变量
queue
线程间的通讯
共享变量
import time
import threading
data_list = []
def get_data_html():
global data_list
for url in data_list:
print('开始获取数据html的时间')
time.sleep(2)
print('获取数据html结束的时间')
def get_data_url():
global data_list
print('开始获取数据url的时间')
time.sleep(3)
for item in range(30):
data_list.append('http://logic.org/{}id'.format(item))
print('获取数据url结束的时间')
if __name__ == '__main__':
thread_url = threading.Thread(target=get_data_url)
thread_1 = threading.Thread(target=get_data_html)
thread_2 = threading.Thread(target=get_data_html)
thread_3 = threading.Thread(target=get_data_html)
thread_4 = threading.Thread(target=get_data_html)
thread_5 = threading.Thread(target=get_data_html)
start_time = time.time()
thread_url.start()
thread_1.start()
thread_2.start()
thread_3.start()
thread_4.start()
thread_5.start()
import time
import threading
# from '第七讲-Tony老师' import test_tool
data_list = []
def get_data_html(data_list):
# global data_list
while True:
if len(data_list):
url=data_list.pop()
# for url in data_list:
print('开始获取数据html的时间')
time.sleep(2)
print('获取数据html结束的时间')
def get_data_url(data_list):
# global data_list
while True:
print('开始获取数据url的时间')
time.sleep(3)
for item in range(30):
data_list.append('http://logic.org/{id}'.format(id=item))
print('获取数据url结束的时间')
if __name__ == '__main__':
thread_url = threading.Thread(target=get_data_url,args=(data_list,))
for item in range(10):
thread_html = threading.Thread(target=get_data_html,args=(data_list,))
thread_html.start()
start_time = time.time()
thread_url.start()
print("中间运行时间:{}".format(time.time()-start_time))