1. 程式人生 > >day39 Pyhton 併發程式設計02 後

day39 Pyhton 併發程式設計02 後

一.開啟子程序的另一種方式

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))