一 线程理论
进程只是把资源集中到一起(进程是资源单位),而线程才是cpu中的执行单位。
一个进程中至少有一个线程,同一个进程中的多个线程资源共享。
二 创建线程的两种方式
方式1
from threading import Thread
import time
def task(name):
print(f'{name}正在执行')
time.sleep(0.2)
print(f'{name}执行结束')
t = Thread(target=task, args=('jasper',))
t.start()
print('主线程')
方式二
from threading import Thread
import time
class MyThread(Thread):
def __init__(self, name):
super().__init__()
self.name = name
def run(self):
print(f'{self.name}正在执行')
time.sleep(0.2)
print(f'{self.name}执行结束')
p = MyThread('jasper')
p.start()
print('主线程')
三 多线程实现tcp服务端并发通信
服务端
from threading import Thread
def talk(sock, addr):
while True:
data = sock.recv(1024)
print(f"来自{addr}{data.decode('utf8')}")
sock.send(f'服务器发送的消息'.encode('utf8'))
if __name__ == '__main__':
server = socket.socket()
server.bind(('127.0.0.1', 8000))
server.listen(5)
while True:
sock, addr = server.accept()
p = Thread(target=talk, args=(sock, addr))
p.start()
客户端
import socket
import time
client = socket.socket()
client.connect(('127.0.0.1', 8000))
while True:
client.send('客户端'.encode('utf8'))
time.sleep(10)
data = client.recv(1024)
print(data.decode('utf8'))
四 join方法
主线程等待子线程结束在执行
from threading import Thread
import time
def test():
print('子线程正在执行')
time.sleep(3)
print('子线程执行结束')
t = Thread(target=test)
t.start()
t.join()
print('主线程')
五 同一进程中的线程数据共享
from threading import Thread
money = 1000
def test():
global money
money = 999
t = Thread(target=test)
t.start()
t.join()
print(money) # 999
六 线程对象相关方法
同一进程中开设的线程的进程号一致
from threading import Thread, current_thread
import os
def test():
print(f'子线程:{current_thread().name}', os.getpid())
for i in range(5):
t = Thread(target=test)
t.start()
# 打印结果
# 子线程:Thread-1 12168
# 子线程:Thread-2 12168
# 子线程:Thread-3 12168
# 子线程:Thread-4 12168
# 子线程:Thread-5 12168
进程下的线程数:active_count()
七 守护线程
主线程结束子线程跟着结束
from threading import Thread
import time
def test():
print('子线程正在执行')
time.sleep(3)
print('子线程执行结束')
t = Thread(target=test)
t.daemon = True
t.start()
print('主进程结束')