一.开启子进程的另一种方式
import os from multiprocessing import Process class MyProcess(Process): def __init__(self,参数): super().__init__() self.一个属性 = 参数 def run(self): print('子进程中要执行的代码') if __name__ == '__main__': conn = '一个链接' mp = MyProcess(conn) mp.start()
锁的概念
import json
import time
from multiprocessing import Process,Lock
def search(name):
'''查询余票的功能'''
with open('ticket') as f:
dic = json.load(f)
print(name , dic['count'])
def buy(name):
with open('ticket') as f:
dic = json.load(f)
time.sleep(0.1)
if dic['count'] > 0:
print(name,'买到票了')
dic['count'] -=1
time.sleep(0.1)
with open('ticket','w') as f:
json.dump(dic,f)
def get_ticket(name,lock):
search(name)
lock.acquire() # 只有第一个到达的进程才能获取锁,剩下的其他人都需要在这里阻塞
buy(name)
lock.release() # 有一个人还锁,会有一个人再结束阻塞拿到钥匙
if __name__ == '__main__':
dic={'count':1}
with open('ticket', 'w') as f:
json.dump(dic, f)
lock = Lock()
for i in range(10):
p = Process(target=get_ticket,args=('name%s'%i,lock))
p.start()
多进程并发
server
import socket,time from multiprocessing import Process def talk(conn): while True: msg = conn.recv(1024).decode() conn.send(msg.upper().encode()) if __name__ == '__main__': # 这句话下面的所有代码都只在主进程中执行 sk = socket.socket() sk.bind(('127.0.0.1',9000)) sk.listen() while True: conn,addr = sk.accept() Process(target=talk,args=(conn,)).start() # 卡 大量的while True 并且代码中并没有太多的其他操作 # 如果我们使用socketserver,不会这么卡 # 多进程确实可以帮助我们实现并发效果,但是还不够完美 # 操作系统没开启一个进程要消耗大量的资源 # 操作系统要负责调度进程 进程越多 调度起来就越吃力
client
import socket sk = socket.socket() sk.connect(('127.0.0.1',9000)) while True: sk.send(b'hello') print(sk.recv(1024))