python:python程式中的進程操作,python程式進程操作

來源:互聯網
上載者:User

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

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.