https://www.cnblogs.com/Eva-J/articles/8253549.html 参考链接
multiprocess模块
进程的生命周期:
1.主进程
2.子进程
开启子进程的主进程:
主进程自己的代码如果长,等待自己的代码执行结束。
子进程的执行时间长,主进程会在主进程代码执行完毕后等待子进程执行完毕后 主进程才结束。
开启一个进程
from multiprocessing import Process import time def func(): print('我是一个子进程') if __name__ == '__main__': # p是一个进程对象 还没有启动进程 p = Process(target=func) # 主进程 # 启动一个子进程. 操作系统创建新进程执行新进程中的代码 p.start() # 主进程 # 一般都是异步开启子进程,主进程先执行 print('riven') print('mark') print('mimi')
传参和查看进程号
Os.getpid :查看当前进程的进程号。
Os.getppid :查看当前进程的父进程号。
from multiprocessing import Process import time import os # 传值给子进程 def func(args, kwargs): print(args) print(kwargs) # 查看当前进程进程号. print(os.getpid()) # 查看当前进程父进程号. print(os.getppid()) if __name__ == '__main__': # args = 传入的参数 p = Process(target=func, args=("我的乖乖", "我太难了")) # 主进程 # 启动一个子进程. 操作系统创建新进程执行新进程中的代码 p.start() # 主进程 # 一般都是异步开启子进程,主进程先执行 print('riven') print('mark') print('mimi') # 查看当前进程父进程号. print(os.getppid()) # 查看当前进程进程号. print(os.getpid())
Join
加了join 将先执行子进程 再执行主进程。
from multiprocessing import Process import time import os # 传值给子进程 def func(args, kwargs): print(args) print(kwargs) if __name__ == '__main__': # args = 传入的参数 p = Process(target=func, args=("我的乖乖", "我太难了")) # 主进程 # 启动一个子进程. 操作系统创建新进程执行新进程中的代码. # 感知一个子程序的结束,将异步程序改为同步. p.start() # 子进程 p.join() print('先执行子进程 再执行主进程')
执行多个子进程(两种方法)
1.基于函数
from multiprocessing import Process import time import os # 传值给子进程 def func(args): print('#' * args) if __name__ == '__main__': # 启动多个子进程 re = [] for i in range(20): p = Process(target=func, args=(i,)) # 主进程 tt = re.append(p) # 1.启动一个子进程. 操作系统创建新进程执行新进程中的代码. # 2.感知一个子程序的结束,将异步程序改为同步. p.start() # 主进程 # join = 先执行子进程 再执行主进程 p.join() print('先执行子进程 再执行主进程')
2.基于类
from multiprocessing import Process import time import os # 子进程 class Myprocess(Process): # 添加init属性 def __init__(self, arg1, arg2): super().__init__() self.arg1 = arg1 self.arg2 = arg2 # 必须执行一个run方法 def run(self): # 查看当前进程的进程号 print(self.pid) # 查看当前进程的名称 print(self.name) print(self.arg1) print(self.arg2) if __name__ == '__main__': # 启动多个子进程 for i in range(20): p = Myprocess('这是一个好的开始', '代码改变世界') # 1.启动一个子进程. 操作系统创建新进程执行新进程中的代码. # 2.感知一个子程序的结束,将异步程序改为同步. p.start() p = Myprocess('good idea', '我想你了') p.start() # 主进程 # join = 先执行子进程 再执行主进程 p.join() print('先执行子进程 再执行主进程')
进程与进程之间的变量问题
from multiprocessing import Process import time import os # 子进程 class Myprocess(Process): # 添加init属性 def __init__(self, arg1, arg2): super().__init__() self.arg1 = arg1 self.arg2 = arg2 # 必须执行一个run方法 def run(self): global n n = 0 if __name__ == '__main__': # 启动多个子进程 for i in range(20): p = Myprocess('这是一个好的开始', '代码改变世界') # 1.启动一个子进程. 操作系统创建新进程执行新进程中的代码. # 2.感知一个子程序的结束,将异步程序改为同步. p.start() # 主进程 # join = 先执行子进程 再执行主进程 p.join() print(n) # PS:在每个进程中定义的变量,只能在本进程中使用
进程之间实现聊天
服务端
# 进程之间实现聊天 import socket from multiprocessing import Process # 子进程 def server(conn): # 接受数据 ret = conn.recv(1024).decode('utf-8') print(ret) conn.send(b'Hello') if __name__ == '__main__': # 创建一个socket sk = socket.socket() # 创建一个域名和端口 sk.bind(('127.0.0.1', 8070)) # 监听客户端的连接 sk.listen() # 接受客户端的数据 conn, addr = sk.accept() # while 1: # 这个循环没有一直在启动进程,因为socket会亢住等待客户端连接 p = Process(target=server, args=(conn,)) p.start()
客户端
import socket from multiprocessing import Process def client(sk, msg): sk.send(bytes(msg, encoding='utf-8')) ret = sk.recv(1024) print(ret) if __name__ == '__main__': sk = socket.socket() sk.connect(('127.0.0.1', 8070)) # while 1: msg = input() p = Process(target=client, args=(sk, msg)) p.start()
守护进程
p.terminate() :在主程序内结束一个子进程。
p.is_alive() :检验一个进程是否还活着的状态。
p.name)() :这个进程的名字。
p.pid() :这个进程的进程号。
from multiprocessing import Process import time def fun1(): while 1: # 给主进程 反馈信息,证明自己在运行。 time.sleep(0.5) print('我还活着呢') if __name__ == '__main__': p = Process(target=fun1) # 设置子进程为守护进程 p.daemon = True p.start() # 结束一个子进程 p.terminate() i = 0 while i < 10 : print('我是主进程') time.sleep(1) # 检验一个主进程 是否还活着 i = i + 1 # 守护进程会随着主进程的代码执行完毕而结束
LOCK锁
Lock:一次只能执行一个子程序,而且只能等执行完之后才能执行下一个。
不加锁会造成数据不安全的操作。
import json from multiprocessing import Process from multiprocessing import Lock import time # 修改数据库必须加锁 def show(i): with open('ticket') as f: str = f.read() obj = json.loads(str) print('%s号查看了 余票: %s' % (i, obj['ticket'])) def buy_ticket(i, lock): # 拿钥匙进门 lock.acquire() with open('ticket') as f: str = f.read() obj = json.loads(str) time.sleep(0.1) if obj['ticket'] > 0: obj['ticket'] -= 1 print('