Python——多进程

进程的实例

# -*- coding:UTF-8 -*-
import os
import time
from multiprocessing import Process  #进程
def func(args,args2): #对应下面的参数1,参数2
    print(args,args2)
    print(54321)
    time.sleep(1)
    print('子进程:',os.getpid())
    print('子进程的父进程:',os.getpid())
    print(12345)
    
if __name__ == '__main__':
    p = Process(target = func,args=('参数1''参数2') # 进程注册,p是一个进程对象、
    p.start()        #启动一个子进程,操作系统创建进程
    print('*'*10)
    print('父进程:',os.getpid())
    print('父进程的父进程:',os.getpid())
    
进程实例

多进程的方法

1、join() #是感知一个子进程的结束

# -*- coding:UTF-8 -*-
import time
from multiprocessing import Process  #进程
def func(arg1,arg2):
    print('*'*arg1)
    time.sleep(1)
    print('*'*arg2)
    
if __name__ = '__main__':
    p = Process(target=func,args(10,20))
    p.start()
    p.join()  #是感知一个子进程的结束 
    print('===========:运行完了
实例

2、开启多个子进程

 1 # -*- coding:UTF-8 -*-
 2 import time
 3 from multiprocessing import Process  #进程
 4 def func(arg1,arg2):
 5     print('*'*arg1)
 6     time.sleep(1)
 7     print('*'*arg2)
 8     
 9 if __name__ = '__main__':
10     p_lst = []
11     for i in rang(10):  #同时启用10个进程
12         p = Process(target=func,args(10*i,20*i))
13         p_lst.append(p)  #将所有进程加入进程列表
14         p.start()
15     [p.join() for p in p_lst] #结束每一个子进程     
16     print('===========:运行完了
实例

 方法2:面向对象的方法

(1)自定义类,继承Process类

(2)必须实现一个run的方法,run方法是在子进程中执行的代码

 1 from multiprocessing import Process  #进程
 2 class MyProcess(Porcess):
 3     def   run(self):
 4         print(self.pid)
 5         print(self.name)
 6         print(os.getpid())
 7     
 8     
 9 if __name__ = '__main__':
10     print('主进程的id:',os.getpid())    
11     p1 = MyProcess()
12     p1.start()
13     p2 = MyProcess()
14     p2.start()
实例

传参数

 1 import os
 2 from multiprocessing import Process  #进程
 3 class MyProcess(Porcess):
 4     def __init__(self,arg1,arg2):
 5         super().__init__()
 6         self.arg1 = arg1
 7         self.arg2 = arg2
 8         
 9     def run(self):
10         print(self.pid)
11         print(self.name)
12         print(os.getpid())
13         print(self.arg1)
14         print(self.arg2)
15     
16     
17 if __name__ = '__main__':
18     print('主进程的id:',os.getpid())    
19     p1 = MyProcess(1,2)
20     p1.start()
21     p2 = MyProcess(3,4)
22     p2.start()
实例

3、使用多进程实现socket服务(tcp协议)

1 import socket
2 
3 sk = socket.socket()
4 sk.connect(('127.0.0.1',8080))
5 msg = sk.recv(1024).decode('utf-8')
6 print(msg)
7 msg2 = input('>>>').encode('utf-8')
8 sk.send(msg2)
9 sk.close()
客户端
 1 import socket
 2 from multiprocessing import Process
 3 def serve(conn):
 4     ret = '你好'.encode('utf-8')
 5     conn.send(ret)
 6     msg = conn.recv(1024).decode('utf-8')
 7     print(msg)
 8     conn.close()
 9 
10 if __name__ == '__main__' :
11     sk = socket.socket()
12     sk.bind(('127.0.0.1',8080))
13     sk.listen()
14     try:
15         while True:
16             conn,addr = sk.accept()
17             p = Process(target=serve,args=(conn,))
18             p.start()
19     finally:
20         sk.close()
服务端

4、守护进程

子进程——转换——守护进程

 1 # 子进程 -- > 守护进程
 2 import time
 3 from multiprocessing import Process
 4 
 5 def func():
 6     while True:
 7         time.sleep(0.2)
 8         print('我还活着')
 9 
10 def func2():
11     print('in func2 start')
12     time.sleep(8)
13     print('in func2 finished')
14 
15 if __name__ == '__main__':
16     p = Process(target=func)
17     p.daemon = True   # 设置子进程为守护进程
18     p.start()
19     p2 = Process(target=func2)
20     p2.start()
21     p2.terminate()     # 结束一个子进程
22     time.sleep(1)
23     print(p2.is_alive())  # 检验一个进程是否还活着
24     print(p2.name)
25     # i = 0
26     # while i<5:
27     #     print('我是socket server')
28     #     time.sleep(1)
29     #     i+=1
30 
31 # 守护进程 会 随着 主进程的代码执行完毕 而 结束
32 # 在主进程内结束一个子进程 p.terminate()
33     #  结束一个进程不是在执行方法之后立即生效,需要一个操作系统响应的过程
34 # 检验一个进程是否活着的状态 p.is_alive()
35 # p.name p.pid 这个进程的名字和进程号
实例

5、进程锁

 1 #
 2 
 3 # 火车票
 4 import json
 5 import time
 6 from multiprocessing import Process
 7 from multiprocessing import Lock
 8 
 9 # def show(i):
10 #     with open('ticket') as f:
11 #         dic = json.load(f)
12 #     print('余票: %s'%dic['ticket'])
13 
14 def buy_ticket(i,lock):
15     lock.acquire() #拿钥匙进门
16     with open('ticket') as f:
17         dic = json.load(f)
18         time.sleep(0.1)
19     if dic['ticket'] > 0 :
20         dic['ticket'] -= 1
21         print('\033[32m%s买到票了\033[0m'%i)
22     else:
23         print('\033[31m%s没买到票\033[0m'%i)
24     time.sleep(0.1)
25     with open('ticket','w') as f:
26         json.dump(dic,f)
27     lock.release()      # 还钥匙
28 
29 if __name__ == '__main__':
30     # for i in range(10):
31     #     p = Process(target=show,args=(i,))
32     #     p.start()
33     lock = Lock()
34     for i in range(10):
35         p = Process(target=buy_ticket, args=(i,lock))
36         p.start()
实例

 

posted @ 2018-10-21 10:59  澄心元素  阅读(169)  评论(0编辑  收藏  举报