13-进程与线程补充

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号的消息(线程池,进程池,队列)

猜你喜欢

转载自www.cnblogs.com/tiantiancode/p/12900381.html