"""
GIL的全称global interpreter lock 意为全局解释器锁。
Python中的一个线程对应与c语言中的一个线程。
GIL使得同一时刻一个CPU只能有一个线程执行字节码, 无法将多个线程映射到多个CPU上执行。
GIL会根据执行的字节码行数以及时间释放GIL,GIL在遇到IO的操作时候会主动释放。
"""
# GIL会释放,释放的位置不定,最后的结果不定
import threading
total = 0
def add():
global total
for i in range(1, 1000000):
total += 1
def sub():
global total
for i in range(1, 1000000):
total -= 1
t1 = threading.Thread(target=add)
t2 = threading.Thread(target=sub)
t1.start()
t2.start()
t1.join()
t2.join()
print(total)
运行结果:
-296591二、Python多线程编程 2.1、通过threading实现多线程
import threading
import time
def thread1():
print('thread1:start_time:%s' % time.time())
time.sleep(2)
print('thread1:end_time:%s' % time.time())
def thread2():
print('thread2:start_time:%s' % time.time())
time.sleep(2)
print('thread2:end_time:%s' % time.time())
if __name__ == '__main__':
t1 = threading.Thread(target=thread1)
t2 = threading.Thread(target=thread2)
start_time = time.time()
t1.start()
t2.start()
# 时间非常小,是运行代码的时间差,而不是2秒
# 这样运行一共有三个线程,主线程和其它两个子线程(thread1、thread2),而且是并行的,子线程启动后,主线程仍然往下运行,因此时间不是2秒
# 守护线程(主线程退出,子线程就会kill掉)
print('end_time:{}'.format(time.time()-start_time))
运行结果:
thread1:start_time:1657777068.6530874 thread2:start_time:1657777068.6530874 end_time:0.0010001659393310547 thread1:end_time:1657777070.6686676 thread2:end_time:1657777070.66866762.2、守护线程
import time
import threading
def thread1(s):
print('thread1:start_time:%s' % time.time())
time.sleep(s)
print('thread1:stop_time:%s' % time.time())
def thread2(s):
print('thread2:start_time:%s' % time.time())
time.sleep(s)
print('thread2:stop_time:%s' % time.time())
if __name__ == '__main__':
t1 = threading.Thread(target=thread1, args=(2,))
t2 = threading.Thread(target=thread2, args=(1,))
# 将线程t1设置成守护线程
"""当程序中非守护线程全部运行完,只有守护线程时,守护线程没有了守护对象,守护线程就会被kill掉。"""
t1.setDaemon(True)
start_time = time.time()
t1.start()
t2.start()
print('end_time:{}'.format(time.time() - start_time))
运行结果:
thread1:start_time:1657777183.1204586 thread2:start_time:1657777183.121459 end_time:0.0010004043579101562 thread2:stop_time:1657777184.12463762.3、等某个子线程执行完再继续执行主线程(join)
import time
import threading
from threading import current_thread
def thread1(s):
print('%s:start_time:%s' % (current_thread().getName(), time.time()))
time.sleep(s)
print('%s:end_time:%s' % (current_thread().getName(), time.time()))
def thread2(s):
print('%s:start_time:%s' % (current_thread().getName(), time.time()))
time.sleep(s)
print('%s:end_time:%s' % (current_thread().getName(), time.time()))
if __name__ == '__main__':
t1 = threading.Thread(target=thread1, args=(2,))
t2 = threading.Thread(target=thread2, args=(1,))
t1.setName('thread1')
t2.setName('thread2')
start_time = time.time()
t1.start()
# 等待线程t1执行完
t1.join()
t2.start()
# 等待线程t2执行完
t2.join()
print('end_time:{}'.format(time.time() - start_time))
运行结果:
thread1:start_time:1657777605.7998574 thread1:end_time:1657777607.8096633 thread2:start_time:1657777607.8096633 thread2:end_time:1657777608.823355 end_time:3.0244987010955812.4、继承Thread实现多线程
import time
import threading
from threading import current_thread
class Thread1(threading.Thread):
def run(self):
# 获取当前线程名称
name1 = current_thread().getName()
name2 = self.getName()
name3 = self.name
print('线程名1:', name1, name2, name3)
print('%s:start_time:%s' % (self.name, time.time()))
time.sleep(2)
print('%s:end_time:%s' % (self.name, time.time()))
class Thread2(threading.Thread):
def run(self):
name1 = current_thread().getName()
name2 = self.getName()
name3 = self.name
print('线程名2:', name1, name2, name3)
print('%s:start_time:%s' % (self.name, time.time()))
time.sleep(1)
print('%s:end_time:%s' % (self.name, time.time()))
if __name__ == '__main__':
thread1 = Thread1()
thread2 = Thread2()
# 设置线程名称
thread1.setName('thread1')
thread2.setName('thread2')
start_time = time.time()
thread1.start()
thread2.start()
thread1.join()
thread2.join()
print('end_time:{}'.format(time.time() - start_time))
运行结果:
线程名1: thread1 thread1 thread1 thread1:start_time:1657777734.236593 线程名2: thread2 thread2 thread2 thread2:start_time:1657777734.2375908 thread2:end_time:1657777735.243757 thread1:end_time:1657777736.2522626 end_time:2.016672372817993三、线程同步 线程锁机制(Lock)
import threading
from threading import Lock
total = 0
lock = Lock()
def add():
global total
for i in range(1, 1000000):
# 获取锁
lock.acquire()
total += 1
# 释放锁
lock.release()
def sub():
global total
for i in range(1, 1000000):
lock.acquire()
total -= 1
lock.release()
if __name__ == '__main__':
t1 = threading.Thread(target=add)
t2 = threading.Thread(target=sub)
t1.start()
t2.start()
t1.join()
t2.join()
print(total)
运行结果:
0暑期编程PK赛 得CSDN机械键盘等精美礼品!



