'''进程于线程的代码实操几乎时一样的'''from threading import Thread
import time
deftask(name):
print(f'{name} is running')
time.sleep(3)
print(f'{name} is over')
# 创建线程无需在__main__下面编写 但是为了统一 还是习惯在子代码中写
t = Thread(target=task, args=('jason', ))
t.start() # 创建线程的开销极小 几乎是一瞬间就可以创建print('主线程')
classMyThread(Thread):
def__init__(self, username):
super().__init__()
self.username = username
defrun(self):
print(f'{self.username} jason is running')
time.sleep(3)
print(f'{self.username} is over')
t = MyThread('jasonNB')
t.start()
print('主线程')
线程实现TCP服务端的并发
from socket import socket
from threading import Thread
server = socket()
server.bind(('127.0.0.1', 8888))
server.listen(5)
deftalk(sock):
whileTrue:
data = sock.recv(1024)
print(data.decode('utf8'))
sock.send(data.upper())
whileTrue:
sock, addr = server.accept()
# 每接听一个客户端就创建一个线程交互数据
t = Thread(target=talk, args=(sock,))
t.start()
线程join方法
from threading import Thread
import time
deftask(name):
print(f'{name} is running')
time.sleep(3)
print(f'{name} is over')
t = Thread(target=task, args=('jason', ))
t.start()
t.join() # 主线程代码等待子线程代码运行完毕之后再往下执行print('主线程')
"""
主线程为什么要等着子线程结束才会结束整个进程
因为主线程结束也就标志着整个进程的结束 要确保子线程运行过程中所需的各项资源
"""
同一个进程内多个线程数据共享
from threading import Thread
import time
name = 'jason'defone():
global name
name = 111print(f'one将name修改为{111}')
deftwo():
print(f'two打印name结果为{name}')
t1 = Thread(target=one)
t2 = Thread(target=two)
t1.start()
t1.join()
t2.start()
>>>one将name修改为111
>>>two打印name结果为111
from threading import Thread
import time
deftask(name):
print(f'{name} is running')
time.sleep(3)
print(f'{name} is over')
t1 = Thread(target=task, args=('jason',))
t2 = Thread(target=task, args=('kevin',))
t1.daemon = True
t1.start()
t2.start()
print('主线程')
GIL全局解释器锁
# 官方文档
In CPython, the global interpreter lock, or GIL, is a mutex that prevents multiple native threads from executing Python bytecodes at once. This lock is necessary mainly
because CPython’s memory management isnot thread-safe. (However, since the GIL exists, other features have grown to depend on the guarantees that it enforces.)
'''
1.回顾
python解释器的类别有很多种
Cpython Jpython Ppython
垃圾回收机制
应用计数、标记清除、分代回收
''''''
GIL只存在于CPython解释器中,不是python的特征
GIL是一把互斥锁用于阻止同一个进程下的多个线程同时执行
原因时因为Cpython解释器中的垃圾回收机制不是线程安全的
反向验证了GIL的存在 如果不存在会产生垃圾回收机制与正常线程之间数据错乱
GIL是在CPython解释器上面加互斥锁 同一个进程下面多个线程想要执行必须先抢GIL锁 所以同一个进程下多线程肯定是不能同时运行的 即无法利用多核优势
虽然用一个进程下的多个线程不能利用多核优势 但是可以开设多个进程
如果多个任务都是IO密集型 那么多线程更有优势(消耗的资源更少)
如果多个任务都是计算密集型那么多线程确实没有优势,但是可以使用多进程
以后用python就可以多进程下面开多线程从而达到效率最大化
'''1.所有的解释性语言都无法做到同一个进程下多个线程利用多核优势
2.GIL在实际编程中其实不需要考虑
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人