# 进程 与 进程之间的数据是隔离的,比如例子两个变量n import osfrom multiprocessing import Processdef func(): global n # 声明了一个全局变量 n = 0 # 重新定义了一个n print('pid : %s'%os.getpid(),n)if __name__ == '__main__': n = 100 p = Process(target=func) p.start() p.join() print(os.getpid(),n)# 使用多进程实现socket服务端的并发效果client端
import socketsk = socket.socket()sk.connect(('127.0.0.1',8080))msg = sk.recv(1024).decode('utf-8')print(msg)msg2 = input('>>>').encode('utf-8')sk.send(msg2)sk.close()server端
import socketfrom multiprocessing import Processdef serve(conn): ret = '你好'.encode('utf-8') conn.send(ret) msg = conn.recv(1024).decode('utf-8') print(msg) conn.close()if __name__ == '__main__' : sk = socket.socket() sk.bind(('127.0.0.1',8080)) sk.listen() try: while True: conn,addr = sk.accept() p = Process(target=serve,args=(conn,)) p.start() finally: sk.close()# 守护进程
# 子进程 -- > 守护进程import timefrom multiprocessing import Processdef func(): while True: time.sleep(0.2) print('我还活着')def func2(): print('in func2 start') time.sleep(8) print('in func2 finished')if __name__ == '__main__': p = Process(target=func) p.daemon = True # 设置子进程为守护进程 p.start() p2 = Process(target=func2) p2.start() p2.terminate() # 结束一个子进程 time.sleep(1) print(p2.is_alive()) # 检验一个进程是否还活着 print(p2.name) # i = 0 # while i<5: # print('我是socket server') # time.sleep(1) # i+=1# 守护进程 会 随着 主进程的代码执行完毕 而 结束# 在主进程内结束一个子进程 p.terminate() # 结束一个进程不是在执行方法之后立即生效,需要一个操作系统响应的过程# 检验一个进程是否活着的状态 p.is_alive()# p.name p.pid 这个进程的名字和进程号
# 锁
# 锁# 火车票ticket文件内容 {"ticket": 1}import jsonimport timefrom multiprocessing import Processfrom multiprocessing import Lock# def show(i):# with open('ticket') as f:# dic = json.load(f)# print('余票: %s'%dic['ticket'])def buy_ticket(i,lock): lock.acquire() #拿钥匙进门 with open('ticket') as f: dic = json.load(f) time.sleep(0.1) if dic['ticket'] > 0 : dic['ticket'] -= 1 print('\033[32m%s买到票了\033[0m'%i) else: print('\033[31m%s没买到票\033[0m'%i) time.sleep(0.1) with open('ticket','w') as f: json.dump(dic,f) lock.release() # 还钥匙if __name__ == '__main__': # for i in range(10): # p = Process(target=show,args=(i,)) # p.start() lock = Lock() for i in range(10): p = Process(target=buy_ticket, args=(i,lock)) p.start()未加锁前(出现一张票七个人买到)加锁后# 多进程的一段报错代码
from multiprocessing import Processdef func(): num = input('>>>') print(num) if __name__ == '__main__': Process(target=func).start()
这段代码执行后会报错,因为开启一个子进程func后给操作系统发送指令,操作系统在另外一片内存区域执行子进程,当前pycharm屏幕不会显示input请输入 所以子经常不能有input,平时我们server很少有input情况,一般是client和client经过server(消息转发)来实现沟通 多进程总结
# 多进程代码# from multiprocessing import Process# 方法 # 进程对象.start() 开启一个子进程 # 进程对象.join() 感知一个子进程的结束 # 进程对象.terminate() 结束一个子进程 # 进程对象.is_alive() 查看某个子进程是否还在运行# 属性 # 进程对象.name 进程名 # 进程对象.pid 进程号 # 进程对象.daemon 值为True的时候,表示新的子进程是一个守护进程 # 守护进程 随着主进程代码的执行结束而结束 # 一定在start之前设置# from multiprocessing import Lock# l = Lock()# l.acquire() # 拿钥匙# 会造成数据不安全的操作# l.release() # 还钥匙
来源:https://www.cnblogs.com/mys6/p/10840747.html