47_并发编程-线程python实现
一、Threading模块
1、线程的创建 - 方式一
1 from threading import Thread
2 import time
3
4 def sayhi(name):
5 time.sleep(2)
6 print('%s say hello' % name)
7
8 if __name__ == '__main__':
9 t = Thread(target=sayhi, args=('太白',))
10 t.start() # 线程一启动,就很快的执行完毕了
11 print('主线程结束')
2、线程创建 - 方式二
1 import time
2 from threading import Thread
3
4 class Sayhi(Thread):
5 def __init__(self, name):
6 super().__init__() # 需要传参数的话需要调取父类__init__()
7 self.name = name
8
9 def run(self): # 必须重写run方法
10 time.sleep(2)
11 print('%s say hello' % self.name)
12
13 if __name__ == '__main__':
14 t = Sayhi('太白') # 创建对象,传入name
15 t.start()
16 print('主线程')
3、多线程与多进程
进程:导入的模块、执行的python文件的文件所在位置、内置的函数、文件里面的这些代码、全局变量等等,然后线程里面有自己的堆栈(类似于一个列表,后进先出)和寄存器,里面存着自己线程的变量,操作(add)等等,占用的空间很小。
1 from threading import Thread
2 from multiprocessing import Process
3 import os
4
5 def work():
6 print('hello',os.getpid())
7
8 if __name__ == '__main__':
9 #part1:在主进程下开启多个线程,每个线程都跟主进程的pid一样
10 t1=Thread(target=work)
11 t2=Thread(target=work)
12 t1.start()
13 t2.start()
14 print('主线程/主进程pid',os.getpid())
15
16 #part2:开多个进程,每个进程都有不同的pid
17 p1=Process(target=work)
18 p2=Process(target=work)
19 p1.start()
20 p2.start()
21 print('主线程/主进程pid',os.getpid())
1 import time
2 from multiprocessing import Process
3 from threading import Thread
4
5 def func(i):
6 print(i**2)
7
8 if __name__ == '__main__':
9
10 # 线程执行
11 t_s_t = time.time()
12 t_lst = []
13 for i in range(10):
14 t = Thread(target=func, args=(i,))
15 t.start()
16 t_lst.append(t)
17 [ot.join() for ot in t_lst]
18 t_e_t = time.time()
19 t_dif = t_e_t - t_s_t # 时间差
20
21 # 进程执行
22 p_s_t = time.time()
23 p_lst = []
24 for i in range(10):
25 p = Process(target=func, args=(i,))
26 p.start()
27 t_lst.append(p)
28 [op.join() for op in t_lst]
29 p_e_t = time.time()
30 p_dif = p_e_t - p_s_t # 时间差
31
32 print('线程>>>', t_dif)
33 print('进程>>>', p_dif)
二、Thread/threading其他方法
1、Thread
isAlive(): 返回线程是否活动的。
etName(): 返回线程名。
setName(): 设置线程名。
join()
2、threading
threading.currentThread(): 返回当前的线程变量。
threading.enumerate(): 返回一个包含正在运行的线程的list。正在运行指线程启动后、结束前,不包括启动前和终止后的线程。
threading.activeCount(): 返回正在运行的线程数量,与len(threading.enumerate())有相同的结果
三、多线程实现socket多人聊天
1 import multiprocessing
2 import threading
3
4 import socket
5 s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
6 s.bind(('127.0.0.1',8080))
7 s.listen(5)
8
9 def action(conn):
10 while True:
11 data=conn.recv(1024)
12 print(data)
13 msg = input('服务端输入:') #在多线程里面可以使用input输入内容,那么就可以实现客户端和服务端的聊天了,多进程不能输入
14 conn.send(bytes(msg,encoding='utf-8'))
15
16 if __name__ == '__main__':
17
18 while True:
19 conn,addr=s.accept()
20 p=threading.Thread(target=action,args=(conn,))
21 p.start()
22
23 tcp_server.py
1 import socket
2
3 s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
4 s.connect(('127.0.0.1',8080))
5
6 while True:
7 msg=input('>>: ').strip()
8 if not msg:continue
9
10 s.send(msg.encode('utf-8'))
11 data=s.recv(1024)
12 print(data)
13
14 tcp_client.py