lesson13进程与线程补充
#视频1-作业讲解
#实现多进程并发服务器
//13作业多进程并发server1.py:
1 import multiprocessing #导入进程模块 2 import socket 3 4 server =socket.socket() 5 server.bind(('0.0.0.0',8080)) 6 server.listen(10) 7 8 def worker(conn): 9 while True: 10 try: 11 data = conn.recv(1024) 12 if data: 13 print("来自{}的消息:{}".format(addr, data)) 14 conn.send(data) 15 else: 16 raise Exception 17 except: 18 print('用户{}断开连接'.format(addr)) 19 conn.close() 20 break 21 22 while True: 23 #处理用户连接的请求 24 conn,addr =server.accept() #生成对等套接字 25 print(addr,'连接') 26 procerss = multiprocessing.Process(target=worker,args=(conn,)) 27 procerss.start() #开启进程
#运行:
server:
('127.0.0.1', 51622) 连接
('127.0.0.1', 51624) 连接
来自('127.0.0.1', 51622)的消息:b'hello'
来自('127.0.0.1', 51624)的消息:b'h1111'
用户('127.0.0.1', 51624)断开连接
client1:
请输入你要发送的数据:hello
hello
收到数据: hello
client2:
请输入你要发送的数据:h1111
h1111
收到数据: h1111
请输入你要发送的数据:quit
quit
自quit断开连接
----------------------------------------------------------------
#视频2-进程和线程的标识--id和名字
2分钟代码:
#13进程和线程标识2.py:
1 import multiprocessing as mp 2 import threading as th 3 import time 4 5 # 1. 进程的ID与线程的ident 6 # 2. 进程名与线程名 7 8 def process_func(): 9 print(mp.current_process()) 10 time.sleep(10) 11 12 def thread_func1(): 13 print(th.current_thread()) 14 time.sleep(10) 15 16 def thread_func2(): 17 time.sleep(10) 18 19 print('进程信息------------------------------------------------') 20 process =mp.Process(target=process_func) #创建一个进程,id 21 process.start() #开启进程 22 print(process.pid) #打印进程id 23 24 25 print('线程信息------------------------------------------------') 26 th_1 =th.Thread(target=thread_func1,name='1号线程') #创建一个线程,ident 27 th_2 =th.Thread(target=thread_func2) 28 th_2.name='2号线程' 29 30 th_1.start() #开启线程程 31 th_2.start() 32 33 print(th_1.ident) #打印线程ident 34 print(th_2.ident) 35 print(th_1.name) #打印线程名字 36 print(th_2.name)
#运行:
进程信息------------------------------------------------
8205
线程信息------------------------------------------------
<Process(Process-1, started)>
<Thread(1号线程, started -1223783616)>
-1223783616
-1234175168
1号线程
2号线程
----------------------------------------------------------------------------------
#视频3-其他操作
# 1. 等待进程或线程结束
# thread.join()阻塞要等process执行完,才能继续执行
# 2. 进程与线程的生存与状态(initial,started,stoped)
# 3. 中止进程(线程不能中止,只能等待其运行结束)-process.teminate()
#13其他操作3.py:
1 import multiprocessing as mp 2 import threading as th 3 import time 4 5 # 1. 等待进程或线程结束 6 # thread.join()阻塞要等process执行完,才能继续执行 7 # 2. 进程与线程的生存与状态(initial,started,stoped) 8 # 3. 中止进程(线程不能中止,只能等待其运行结束)-process.teminate() 9 10 def process_func(): 11 print("子进程工作开始,") 12 time.sleep(5) 13 print("terminate中止进程,看看这里子进程函数有没有开始工作") 14 15 def thread_func1(): 16 time.sleep(1) 17 print("th_1.join()子线程工作完了,再轮到主进程执行") 18 19 process =mp.Process(target=process_func) #创建一个进程,id 20 th_1 =th.Thread(target=thread_func1,name='1号线程') #创建一个线程,ident 21 22 print(th_1) #子线程运行状态--刚创建 23 th_1.start() 24 print(th_1) #子线程运行状态--正在开启 25 th_1.join() 26 print(th_1) #子线程运行状态--运行结束 27 28 29 process.start() #启动进程 30 time.sleep(2) 31 process.terminate() #主动杀死进程,process_func不调用 32 33 print("主进程的工作开始")
#运行:
<Thread(1号线程, initial)>
<Thread(1号线程, started -1223447744)>
th_1.join()子线程工作完了,再轮到主进程执行
<Thread(1号线程, stopped -1223447744)>
子进程工作开始,
主进程的工作开始
----------------------------------------------------------------------------------
#视频4-面向对象
守护模式daemon
process.daemon = True 表示以守护模式工作(多线程守护线程与守护进程的守护模式相似)
未完。
#13守护模式4.py:
1 import multiprocessing as mp 2 import threading as th 3 import time 4 5 def process_func(): 6 print("sub-process start") 7 time.sleep(5) 8 print("sub-process end") 9 10 #deamon守护模式,例子,关闭网页x,所有子标签都关闭 11 process =mp.Process(target=process_func,daemon=True) #创建一个进程,id 12 13 print(process.is_alive()) #判断是否在工作 14 process.start() #启动进程 15 time.sleep(2) 16 17 print('主进程工作完直接把子进程杀死') #主进程工作
#运行:
False
sub-process start
主进程工作完直接把子进程杀死
----------------------------------------------------------------------------------
#视频5-面向对象实现并发服务器
#13面向对象进程5.py:
1 import multiprocessing as mp 2 3 #面向对象使用线程/进程 4 #1,继承process或Thread类 5 #2,重写__init__方法 6 #3,重写run方法 7 class MyProcess(mp.Process): # 继承 8 def __init__(self,mingzi): 9 super().__init__(name=mingzi) # 调用父类的方法,生成一个进程 10 11 def run(self): 12 print('做了一些事情') 13 14 15 process = MyProcess('句号') # 创建一个进程 16 process.start() 17 print(process)
#运行:
<MyProcess(句号, started)>
做了一些事情
---------------------------------------------
#13面向对象并发server6.py:
1 import multiprocessing as mp 2 import socket 3 4 server =socket.socket() 5 server.bind(('0.0.0.0',8080)) 6 server.listen(5) 7 8 #面向对象实现并发服务器 9 class MyProcess(mp.Process): # 继承 10 def __init__(self,conn,addr): 11 super().__init__() # 调用父类的方法,生成一个进程 12 self.conn=conn 13 self.addr=addr 14 15 def run(self): 16 while True: 17 data = self.conn.recv(1024) 18 if data: 19 print('收到来自{}的消息{}'.format(self.addr,data.decode())) 20 self.conn.send(data) 21 else: 22 print('用户{}断开连接'.format(self.addr)) 23 self.conn.close() 24 break 25 26 while True: 27 conn, addr = server.accept() # 生成对等套接字 28 print('用户{}连接'.format(addr)) 29 process = MyProcess(conn,addr) 30 process.start()
#运行:
server:
用户('127.0.0.1', 51652)连接
用户('127.0.0.1', 51654)连接
收到来自('127.0.0.1', 51652)的消息hhhhh11111
收到来自('127.0.0.1', 51654)的消息jjjjj22222
用户('127.0.0.1', 51654)断开连接
client1:
请输入你要发送的数据:hhhhh11111
hhhhh11111
收到数据: hhhhh11111
client2:
请输入你要发送的数据:jjjjj22222
jjjjj22222
收到数据: jjjjj22222
请输入你要发送的数据:quit
quit
自quit断开连接
#作业:
1,面向对象的方式实现多线程服务器
2,聊天室,1号client发消息,其他client也可以收到1号的消息(线程池,进程池,队列)