python進程通信方式有幾種_python全棧開發基礎【第二十一篇】互斥鎖以及進程之間的三種通信方式(IPC)以及生產者個消費者模型...

一、互斥鎖

進程之間數據隔離,但是共享一套文件系統,因而可以通過文件來實現進程直接的通信,但問題是必須自己加鎖處理。

注意:加鎖的目的是為了保證多個進程修改同一塊數據時,同一時間只能有一個修改,即串行的修改,沒錯,速度是慢了,犧牲了速度而保證了數據安全。

1.上廁所的小例子:你上廁所的時候肯定得鎖門吧,有人來了看見門鎖著,就會在外面等著,等你吧門開開出來的時候,下一個人才去上廁所。

from multiprocessing import Process,Lock

import os

import time

def work(mutex):

mutex.acquire()

print(‘task[%s] 上廁所‘%os.getpid())

time.sleep(3)

print(‘task[%s] 上完廁所‘%os.getpid())

mutex.release()

if __name__ == ‘__main__‘:

mutex = Lock()

p1 = Process(target=work,args=(mutex,))

p2 = Process(target=work,args=(mutex,))

p3 = Process(target=work,args=(mutex,))

p1.start()

p2.start()

p3.start()

p1.join()

p2.join()

p3.join()

print(‘主‘)

2.模擬搶票(也是利用了互斥鎖的原理 ?:LOCK互斥鎖)

import json

import time

import random

import os

from multiprocessing import Process,Lock

def chakan():

dic = json.load(open(‘piao‘,)) # 先查看票數,也就是打開那個文件

print(‘剩余票數:%s‘ % dic[‘count‘]) # 查看剩余的票數

def buy():

dic = json.load(open(‘piao‘,))

if dic[‘count‘]>0: #如果還有票

dic[‘count‘]-=1 #就修改里面的值-1

time.sleep(random.randint(1,3)) #執行里面買票的一系列操作就先不執行了,讓睡一會代替(并且隨機的睡)

json.dump(dic,open(‘piao‘,‘w‘))

print(‘%s 購票成功‘ % os.getpid()) # 當前的那個id購票成功

def task(mutex): #搶票

chakan() #因為查看的時候大家都可以看到,不需要加鎖

mutex.acquire() #加鎖

buy() #買的時候必須一個一個的買,先等一個人買完了,后面的人在買

mutex.release() #取消鎖

if __name__ == ‘__main__‘:

mutex = Lock()

for i in range(50):#讓50個人去訪問那個票數

p = Process(target=task,args=(mutex,))

p.start()

二、Process對象的其他屬性

p.daemon :守護進程(必須在開啟之前設置守護進程):如果父進程死,子進程p也死了

p.join:父進程等p執行完了才運行主進程,是父進程阻塞在原地,而p仍然在后臺運行。

terminate:強制關閉。(確保p里面沒有其他子進程的時候關閉,如果里面有子進程,你去用這個方法強制關閉了就會產生僵尸進程(打個比方:如果你老子掛了,你還沒掛,那么就沒人給你收尸了,啊哈哈))

is_alive:關閉進程的時候,不會立即關閉,所以is_alive立刻查看的結果可能還是存活

p.join():父進程在等p的結束,是父進程阻塞在原地,而p仍然在后臺運行

p.name:查看名字

p.pid :查看id

我們可以簡單介紹一下僵尸進程:

子進程運行完成,但是父進程遲遲沒有進行回收,此時子進程實際上并沒有退出,其仍然占用著系統資源,這樣的?進程稱為僵尸進程。

因為僵尸進程的資源一直未被回收,造成了系統資源的浪費,過多的僵尸進程將造成系統性能下降,所以應避免出現僵尸進程。

from multiprocessing import Process

import os

import time

def work():

print(‘%s is working‘%os.getpid())

time.sleep(3)

if __name__ == ‘__main__‘:

p1 =Process(target=work)

p2 =Process(target=work)

p3 =Process(target=work)

# p1.daemon = True

# p2.daemon = True #守護進程(守護他爹)

# p3.daemon = True #主進程死了子進程也死了(就不會執行子進程了)

p1.start()

p2.start()

p3.start()

p3.join()

p2.join()

p1.join() #多個join就是在等花費時間最長的那個運行完就執行主程序了

print(‘主程序‘)

# -了解方法---------------

# p1.terminate() #強制關閉進程

# time.sleep(3)

# print(p1.is_alive()) #看是不是還活著

# print(p1.name) #查看進程名字

# print(p1.pid) #查看id號

# print(‘主程序‘)

三、進程間的三種通信(IPC)方式:

方式一:隊列(推薦使用)

進程彼此之間互相隔離,要實現進程間通信(IPC),multiprocessing模塊支持兩種形式:隊列和管道,這兩種方式都是使用消息傳遞的

1.隊列:隊列類似于一條管道,元素先進先出

需要注意的一點是:隊列都是在內存中操作,進程退出,隊列清空,另外,隊列也是一個阻塞的形態

2.隊列分類

隊列有很多種,但都依賴與模塊queue

queue.Queue() #先進先出

queue.LifoQueue() #后進先出

queue.PriorityQueue() #優先級隊列

queue.deque() #雙線隊列

創建隊列的類(底層就是以管道和鎖定的方式實現):

Queue([maxsize]):創建共享的進程隊列,Queue是多進程安全的隊列,

可以使用Queue實現多進程之間的數據傳遞。

參數介紹:

maxsize是隊列中允許最大項數,省略則無大小限制。

方法介紹:

q.put方法用以插入數據到隊列中,put方法還有兩個可選參數:blocked和timeout。如果blocked為True(默認值),并且timeout為正值,該方法會阻塞timeout指定的時間,直到該隊列有剩余的空間。如果超時,會拋出Queue.Full異常。如果blocked為False,但該Queue已滿,會立即拋出Queue.Full異常。

q.get方法可以從隊列讀取并且刪除一個元素。同樣,get方法有兩個可選參數:blocked和timeout。如果blocked為True(默認值),并且timeout為正值,那么在等待時間內沒有取到任何元素,會拋出Queue.Empty異常。如果blocked為False,有兩種情況存在,如果Queue有一個值可用,則立即返回該值,否則,如果隊列為空,則立即拋出Queue.Empty異常.

q.get_nowait():同q.get(False)

q.put_nowait():同q.put(False)

q.empty():調用此方法時q為空則返回True,該結果不可靠,比如在返回True的過程中,如果隊列中又加入了項目。

q.full():調用此方法時q已滿則返回True,該結果不可靠,比如在返回True的過程中,如果隊列中的項目被取走。

q.qsize():返回隊列中目前項目的正確數量,結果也不可靠,理由同q.empty()和q.full()一樣

應用:

#隊列

# 1.可以往隊列里放任意類型的

# 2.先進先出

from multiprocessing import Process,Queue

q= Queue(3)

q.put(‘first‘) #默認block=True

q.put(‘second‘)

q.put(‘third‘)

print(q.get())

print(q.get())

print(q.get())

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/455441.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/455441.shtml
英文地址,請注明出處:http://en.pswp.cn/news/455441.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python實現修改圖片尺寸

起步 很多小伙伴從網上找的圖片可能圖片尺寸與自己的需求不符合 今天小編就教大家使用python寫一個簡單腳本程序實現修改圖片的尺寸 環境準備 首先我們需要python環境,它的安裝可以參考:python安裝以及版本檢測 其次我們還需要安裝一個python圖形化的庫PIL PIL的安裝,這里…

數據集

https://zhuanlan.zhihu.com/p/25138563轉載于:https://www.cnblogs.com/zhangbojiangfeng/p/7039725.html

常見的攻擊手段及其防御方式

本文簡單介紹幾種常見的攻擊手段及其防御方式 XSS(跨站腳本攻擊)CSRF(跨站請求偽造)SQL注入DDOSXSS 概念 全稱是跨站腳本攻擊(Cross Site Scripting),指攻擊者在網頁中嵌入惡意腳本程序。案列 比如說我寫了一個博客網站…

使用ffmpeg進行h.264編碼

m_fmt->video_codec CODEC_ID_H264; /* 添加視頻流 */ m_video_st av_new_stream(m_oc, 0); if (!m_video_st) { return 0; } m_videocavcodec_alloc_context(); m_videoc m_video_st->codec; /* 視頻相關參數 */ m_videoc->codec_id m_fmt->video_codec; m_…

關于java的關鍵字 transient

我們都知道一個對象只要實現了Serilizable接口,這個對象就可以被序列化,Java的這種序列化模式為開發者提供了很多便利,我們可以不必關系具體序列化的過程,只要這個類實現了Serilizable接口,這個的所有屬性和方法都會自…

python中文件變化監控-watchdog

起步 在python中文件監控主要有兩個庫,一個是pyinotify,一個是watchdog。pyinotify依賴于Linux平臺的inotify,后者則對不同平臺的的事件都進行了封裝。因為我主要用于Windows平臺,所以下面著重介紹watchdog(推薦大家閱…

python決策樹分類鳶尾花_基于決策樹—鳶尾花分類

決策樹算法廣泛應用于:語音識別、醫療診斷、客戶關系管理、模式識別、專家系統等,在實際工作中,必須根據數據類型的特點及數據集的大小,選擇合適的算法。本文選擇經典案例——《鳶尾花分類》一、決策樹定義決策樹算法是一種基于實…

希捷宣布出貨雙碟裝1TB硬盤 單碟500GB上市

希捷今天宣布,單碟容量高達500GB的Barracuda 7200.12 1TB硬盤已經出貨。 現有的1TB硬盤產品一般都是三碟裝(此前也有四碟裝),包括希捷自家的ST31000340AS,但希捷一進率先將其升級為雙碟裝,存儲密度也達到了329Gb每平方英寸。這樣一…

P1334 瑞瑞的木板

題目描述 瑞瑞想要親自修復在他的一個小牧場周圍的圍欄。他測量柵欄并發現他需要N(1≤N≤20,000)根木板,每根的長度為整數Li(1≤Li≤50,000)。于是,他神奇地買了一根足夠長的木板,長度為所需的N…

FFMpeg的output_example.c例子分析

該例子講了如何輸出一個libavformat庫所支持格式的媒體文件。 (1)av_register_all(),初始化libavcodec庫,并注冊所有的編解碼器和格式。 (2)guess_format(),根據文件名來獲取輸出文件格式&#…

大量數據+同步+多線程_Vulkan 多線程渲染

1. Overview of Vulkan1.1 計算機圖形軟件圖形軟件有兩個大類:專用軟件包(special-purpose packages)和通用編程軟件包(general programming packages)。專用軟件包通常提供一種UI設計語言,讓用戶直接生成想…

飛康任命Gartner前分析師擔任亞洲區市場總監

在虛擬化、數據保護和數據遷移領域具備15年創新經驗的美國飛康軟件公司(FalconStor Software, Inc.,NASDAQ:FALC)近日宣布任命張瑾(Jimmie Chang)先生擔任該公司亞洲區市場部門負責人。 飛康公司近日面向全…

12_登陸案例

13131轉載于:https://www.cnblogs.com/ZHONGZHENHUA/p/7044846.html

如何基于FFMPEG和SDL寫一個少于1000行代碼的視頻播放器

http://blog.csdn.net/eplaylity/archive/2008/12/05/3454431.aspx http://www.cnblogs.com/konyel/tag/SDLGuide%E4%B8%AD%E6%96%87%E8%AF%91%E7%89%88/ ffmpeg文檔http://blog.sina.com.cn/s/blog_46dc65a90100a91b.html http://dranger.com/ffmpeg/ffmpeg.html VLC核心功能部…

Flask 概述

什么是Web Framework? Web Application Framework(Web應用程序框架)或簡單的Web Framework(Web框架)表示一個庫和模塊的集合,使Web應用程序開發人員能夠編寫應用程序,而不必擔心協議&#xff0…

(五)Maven中的聚合和繼承

一、為什么要聚合? 定義:我們在開發過程中,創建了2個以上的模塊,每個模塊都是一個獨立的maven project,在開始的時候我們可以獨立的編譯和測試運行每個模塊,但是隨著項目的不斷變大和復雜化,我們…

python堆棧反向輸出列表_python - IPython:將Python腳本的輸出重定向到文件(如bash) - 堆棧內存溢出...

IPython有自己的上下文管理器來捕獲stdout / err ,但它沒有重定向到文件,它重定向到一個對象:from IPython.utils import iowith io.capture_output() as captured:%run my_script.pyprint captured.stdout # prints stdout from your script…

關于datagrid

基本在公司使用的datagrid不需要自己寫前臺代碼,只需要自己給grid明確id,url以及列屬性即可。 后臺需要返回一個數據類型:{recordsFiltered2, data[], drawnull, recordsTotal2},通常返回這個數據類型的話,只需要調用d…

M-JPEG、MPEG4、H.264都有何區別 依維安防論壇

壓縮方式是網絡視頻服務器和網絡攝像機的核心技術,壓縮方式很大程度上決定著圖像的質量、壓縮比、傳輸效率、傳輸速度等性能,它是評價網絡視頻服務器和網絡攝像機性能優劣的重要一環。 隨著多媒體技術的發展,相繼推出了許多壓縮編碼標準&…

Django/Flask/Tornado三大web框架性能分析

寫在前面:本文的數據涉及到之前遇到過的問題,大概一次 http 請求到收到響應需要多少時間。這個問題在實際工作中與框架有比較大的關系,因此特別就框架的性能做了一次分析。這里使用之前的一個報告數據: Pythons Web Framework Ben…