python:python程式中的進程操作,python程式進程操作
一、多進程應用
import socketfrom multiprocessing import Processdef talk(conn): conn.send(b'connected') ret = conn.recv(1024) print(ret)if __name__ == '__main__': sk = socket.socket() sk.bind(('127.0.0.1', 8080)) sk.listen() while True: conn,addr = sk.accept() p = Process(target=talk,args=(conn,)) p.start() conn.close() sk.close()server
import socketsk = socket.socket()sk.connect(('127.0.0.1',8080))ret = sk.recv(1024)print(ret)msg = input('>>>')sk.send(msg.encode('utf-8'))sk.close()client
二、進程中的其他方法
import timefrom multiprocessing import Processdef func(): print('--'*10) time.sleep(15) print('--'*10)def cal_time(): while True: time.sleep(1) print('過去了1秒')if __name__ == '__main__': p = Process(target=cal_time) p.daemon = True #守護進程:一定在開啟進程之前設定 p.start() p2 = Process(target=func) # 15s p2.start() for i in range(100): # 10s time.sleep(0.1) print('*'*i) p2.join()
1,start()開啟一個進程
join:用join可以讓主進程等待子進程結束
1)p.daemon =True #守護進程
守護進程會隨著主進程的代碼執行結束而結束
正常的子進程沒有執行完的時候主進程要一直等著
2)守護進程的作用
會隨著主進程的代碼執行結束而結束,不會等待其他子進程
3)注意:
守護進程要在start之間設定
守護進程中不能再開啟子進程
2,is_alive與terminate
import timefrom multiprocessing import Processdef func(): print('wahaha') time.sleep(5) print('qqxing')if __name__ == '__main__': p = Process(target=func) p.start() print(p.is_alive()) time.sleep(0.1) p.terminate() print(p.is_alive()) time.sleep(1) print(p.is_alive())
p.is_alive() # 是否活著 True代表進程還在 False代表進程不在了
p.terminate() # 結束一個進程,但是這個進程不會立刻被殺死
def func(): print('wahaha') time.sleep(5) print('qqxing')if __name__ == '__main__': p = Process(target=func) p.start() print(p.name,p.pid) p.name = '哇哈哈哈' print(p.name)class MyProcess(Process): def run(self): print('wahaha',self.name,self.pid) time.sleep(5) print('qqxing',self.name,self.pid)if __name__ == '__main__': p = MyProcess() p.start() print(p.pid)# pid 查看這個進程 進程id# name 查看這個進程的名字
三、鎖
from multiprocessing import Lock#調用鎖lock = Lock() #建立一個鎖lock.acquire() # 需要鎖 拿鑰匙lock.acquire() # 需要鎖 發生阻塞lock.release() # 釋放鎖 還鑰匙
鎖 就是在並發編程中 保證資料安全
import jsonimport timeimport randomfrom multiprocessing import Lockfrom multiprocessing import Processdef search(i): with open('ticket') as f: print(i,json.load(f)['count'])def get(i): with open('ticket') as f: ticket_num = json.load(f)['count'] time.sleep(random.random()) if ticket_num > 0: with open('ticket','w') as f: json.dump({'count':ticket_num-1},f) print('%s買到票了'%i) else: print('%s沒票了'%i)def task(i,lock): search(i) # 查看票 lock.acquire() get(i) # 搶票 lock.release()if __name__ == '__main__': lock = Lock() for i in range(20): # 20個人同時搶票 p = Process(target=task,args=(i,lock)) p.start()import jsonimport timeimport randomfrom multiprocessing import Lockfrom multiprocessing import Processdef search(i): with open('ticket') as f: print(i,json.load(f)['count'])def get(i): with open('ticket') as f: ticket_num = json.load(f)['count'] time.sleep(random.random()) if ticket_num > 0: with open('ticket','w') as f: json.dump({'count':ticket_num-1},f) print('%s買到票了'%i) else: print('%s沒票了'%i)def task(i,lock): search(i) # 查看票 lock.acquire() get(i) # 搶票 lock.release()if __name__ == '__main__': lock = Lock() for i in range(20): # 20個人同時搶票 p = Process(target=task,args=(i,lock)) p.start()買火車票的程式
四、訊號量
import timeimport randomfrom multiprocessing import Semaphore#調用訊號量from multiprocessing import Processdef sing(i,sem): sem.acquire() print('%s : 進入 ktv'%i) time.sleep(random.randint(1,10)) print('%s : 出 ktv'%i) sem.release()# 迷你唱吧 20個人,同一時間只能有4個人進去唱歌if __name__ == '__main__': sem = Semaphore(4) for i in range(20): Process(target=sing,args=(i,sem)).start()#訊號量的數量就是鎖當中鑰匙的數量
五、事件
事件 —— 非同步阻塞
事件是所有的進程,都陷入阻塞
from multiprocessing import Event #呼叫事件模組# e = Event() # 執行個體化一個事件 標誌/類似於交通號誌# e.set() # 將標誌變成非阻塞/類似於交通燈變綠# e.wait() # 剛執行個體化出來的一個事件對象,預設的訊號是阻塞訊號/預設是紅燈# # 執行到wait,要先看燈,綠燈行紅燈停,如果在停的過程中燈綠了,# # 就變成非阻塞了# e.clear() # 將標誌又變成阻塞/交通燈變紅## e.is_set() # 是否阻塞 True就是綠燈 False就是紅燈
import timeimport randomfrom multiprocessing import Processfrom multiprocessing import Eventdef traffic_light(e): while True: if e.is_set(): time.sleep(3) print('紅燈亮') e.clear() # 綠變紅 else: time.sleep(3) print('綠燈亮') e.set() # 紅變綠def car(i,e): e.wait() print('%s車通過'%i)if __name__ == '__main__': e = Event() # 立一個紅燈 tra = Process(target=traffic_light,args=(e,)) tra.start() # 啟動一個進程來控制紅綠燈 for i in range(100): if i%6 == 0 : time.sleep(random.randint(1,3)) car_pro = Process(target=car, args=(i,e)) car_pro.start()
六、隊列
隊列進程之間的通訊
1.進程之間通訊 可以使用multiprocessing 的 Queue模組
2.隊列有兩種建立方式 第一種不傳參數 這個隊列就沒有長度限制 ;傳參數,建立一個有最大長度限制的隊列
3.提供兩個重要方法;put get
4.qsize查看隊列的大小
import timedef producer(q): # 生產者 for i in range(100): q.put('包子%s'%i)def consumer(q): # 消費者 for i in range(100): time.sleep(1) print(q.get())if __name__ == '__main__': q = Queue(10) # 托盤 p = Process(target=producer,args=(q,)) p.start() c1 = Process(target=consumer, args=(q,)) c2 = Process(target=consumer, args=(q,)) c1.start() c2.start()