day39 Pyhton 併發程式設計02 後
阿新 • • 發佈:2018-12-07
一.開啟子程序的另一種方式
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))