欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python中進(jìn)程間通信詳細(xì)介紹

 更新時(shí)間:2021年12月16日 10:14:09   作者:jialan75  
大家好,本篇文章主要講的是python中進(jìn)程間通信詳細(xì)介紹,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話(huà)記得收藏一下,方便下次瀏覽

進(jìn)程間通信(IPC)

必要性

進(jìn)程間空間獨(dú)立,資源不共享,此時(shí)在需要進(jìn)程間數(shù)據(jù)傳輸時(shí)就需要特定的手段進(jìn)行數(shù)據(jù)通信

常用進(jìn)程間通信方法

管道 消息隊(duì)列 共享內(nèi)存 型號(hào) 信號(hào)量 套接字

管道通信(Pipe)

1.通信原理

在內(nèi)存中開(kāi)辟管道空間,生成管道操作對(duì)象,多個(gè)進(jìn)程使用同一個(gè)管道對(duì)象進(jìn)行讀寫(xiě)即可實(shí)現(xiàn)通信

代碼演示(windows 無(wú)效 linux 可用)

"""
pipe.py 管道通信
注意
1. multiprocessing 中管道通信只能用于有親緣關(guān)系進(jìn)程中
2. 管道對(duì)象在父進(jìn)程中創(chuàng)建,子進(jìn)程通過(guò)父進(jìn)程獲取
"""
from multiprocessing import Process, Pipe

# 創(chuàng)建 管道
fd1, fd2 = Pipe()
def app1():
    print('1 啟動(dòng)應(yīng)用1,請(qǐng)登錄')
    print('2 請(qǐng)求app2授權(quán)')
    fd1.send('app1 請(qǐng)求登錄')
    data = fd1.recv()
    print('5 ??',data)
    if data:
        print('6 登錄成功:', data)


def app2():
    print('2.5')
    # 阻塞等待讀取管道內(nèi)容
    data = fd2.recv()
    print('3 app2', data)
    fd2.send(('Dave', '123'))
    print('4 app2,發(fā)送完畢')


if __name__ == '__main__':
    print(-5)
    p1 = Process(target=app1)
    print(-4)
    p2 = Process(target=app2)
    print(-3)
    p1.start()
    print(-2)
    p2.start()
    print(-1)
    p1.join()
    print(0)
    p2.join()
    print('運(yùn)行結(jié)束')
"""
運(yùn)行結(jié)果
(base) [root@VM-0-12-centos pipe]# python pipe.py
-5
-4
-3
-2
-1
1 啟動(dòng)應(yīng)用1,請(qǐng)登錄
2 請(qǐng)求app2授權(quán)
2.5
3 app2 app1 請(qǐng)求登錄
4 app2,發(fā)送完畢
5 ?? ('Dave', '123')
6 登錄成功: ('Dave', '123')
0
運(yùn)行結(jié)束

"""

消息隊(duì)列

在內(nèi)存中建立隊(duì)列模型,進(jìn)程通過(guò)隊(duì)列將消息存入,或者從隊(duì)列取出完成 進(jìn)程間通信

2. 實(shí)現(xiàn)方法

"""
quque_test.py 消息隊(duì)列演示
注意: 消息隊(duì)列符合先進(jìn)先出原則
"""

# 創(chuàng)建消息隊(duì)列
from multiprocessing import Queue, Process
from random import randint

# 以下模擬 雙色球
# 創(chuàng)建消息隊(duì)列
q = Queue(5)

def handle():
    print(5)
    for i in range(6):
        q.put(randint(1, 33))
    q.put(randint(1, 16))

def request():
    print(6)
    l = [q.get() for i in range(6)]
    l.sort()
    l.append(q.get())
    print(7,l)

if __name__ == '__main__':
    print(0)
    p1 = Process(target=handle)
    print(1)
    p2 = Process(target=request)
    print(2)
    p1.start()
    print(3)
    p2.start()
    print(4)
    p1.join()
    p2.join()
    print(8)
    print('程序結(jié)束')

控制臺(tái)輸出 linux (windows無(wú)效)

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-cXtoSmyN-1639571874327)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211215185302558.png)]

共享內(nèi)存

1.通信原理

在內(nèi)存中開(kāi)辟一塊空間,進(jìn)程可以寫(xiě)入內(nèi)容和讀取內(nèi)容完成通信,但是每次寫(xiě)入內(nèi)容會(huì)覆蓋之前內(nèi)容

2.實(shí)現(xiàn)方法

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-A5RVhKd1-1639571874328)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211215185911875.png)]

value ,array

from multiprocessing import Value,Array

obj = Value(ctype,data)
功能: 開(kāi)辟共享內(nèi)存
參數(shù): ctype 表示共享內(nèi)存空間類(lèi)型 'i' 'f' 'c'
	data 共享內(nèi)存空間初始數(shù)據(jù)
返回值: 共享內(nèi)存對(duì)象

obj.value 對(duì)象屬性的修改查看即對(duì)共享內(nèi)存讀寫(xiě)

obj = Array(ctype,data)
功能: 開(kāi)辟共享內(nèi)存
參數(shù): ctype 表示共享內(nèi)存空間類(lèi)型 'i' 'f' 'c'
	data 整數(shù)表示開(kāi)辟空間的大小,其數(shù)據(jù)表示開(kāi)辟空間
返回值: 共享內(nèi)存對(duì)象

Array共享內(nèi)存讀寫(xiě):通過(guò)遍歷obj可以得到每個(gè)值,直接通過(guò)索引可以修改

* 可以使用obj.value 直接打印共享內(nèi)存中的字節(jié)串

value 代碼 演示

"""
value.py 開(kāi)辟單一共享內(nèi)存空間
注意:共享內(nèi)存只能有一個(gè)值
"""

from multiprocessing import Value,Array,Process


import time
import random
ctype = 'i'
data = 5000
# 創(chuàng)建共享內(nèi)存
money = Value(ctype,data)

# 操作共享內(nèi)存
def man():
    for i in range(30):
        time.sleep(0.1)
        money.value += random.randint(1,1000)
        print('man',money.value)

def girl():
    for i in range(30):
        time.sleep(0.1)
        money.value -= random.randint(1,800)
        print('girl', money.value)

if __name__ == '__main__':
    p1 = Process(target=man)
    p2 = Process(target=girl)
    p1.start()
    p2.start()
    p1.join()
    p2.join()
    print('程序結(jié)束',money.value)

array 代碼演示

"""
array.py 開(kāi)辟單一共享內(nèi)存空間
注意:共享內(nèi)存只能有一個(gè)值
"""

from multiprocessing import Array,Process


ctype = 'i'
data = [1,2,3,4]
# 創(chuàng)建共享內(nèi)存
# shm = Array(ctype,data)

# 表示初始值 [0,0,0,0,0]
shm = Array(ctype,5)


def fun():
    for i in shm:
        print(i)
    shm[1] = 1000
if __name__ == '__main__':
    p1 = Process(target=fun)
    p1.start()
    p1.join()
    print('程序結(jié)束',shm[1])

信號(hào)量(信號(hào)燈集)

1.通信原理

給定一個(gè)數(shù)量多多個(gè)進(jìn)程可見(jiàn),多個(gè)進(jìn)程都可以操作該數(shù)增減,并根據(jù)數(shù)量值決定自己的行為

2. 實(shí)現(xiàn)方法

from multiprocessing import Semaphore

sem = Semaphore(num)
功能: 創(chuàng)建信號(hào)量對(duì)象
參數(shù): 信號(hào)量的初始值
返回值: 信號(hào)量對(duì)象

sem.acquire() 信號(hào)量減1 當(dāng)信號(hào)量為0時(shí)阻塞
sem.release() 信號(hào)量加1
sem.get_value() 獲取信號(hào)量數(shù)量

3.代碼演示

"""
信號(hào)量.py 信號(hào)量演示
思路: 信號(hào)量數(shù)量相當(dāng)于資源,執(zhí)行任務(wù)必須消耗資源
"""
import os
from multiprocessing import Semaphore
from multiprocessing import Process
from time import sleep

num = 3
sem = Semaphore(num)


# 任務(wù)函數(shù)
def handle():
    sem.acquire()  # sem -1
    print("%s 開(kāi)始執(zhí)行任務(wù)" % os.getpid())
    sleep(3)
    print("%s 執(zhí)行任務(wù)完畢" % os.getpid())
    sem.release()  # sem +1


if __name__ == '__main__':
    ths = []
    for i in range(10):
        p = Process(target=handle)
        p.start()
        ths.append(p)

    for p in ths:
        p.join()
    print('程序結(jié)束')

控制臺(tái)運(yùn)行結(jié)果

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-BjnjTpgF-1639571874329)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211215203718835.png)]

到此這篇關(guān)于python中進(jìn)程間通信詳細(xì)介紹的文章就介紹到這了,更多相關(guān)python進(jìn)程間通信內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 如何用Python來(lái)搭建一個(gè)簡(jiǎn)單的推薦系統(tǒng)

    如何用Python來(lái)搭建一個(gè)簡(jiǎn)單的推薦系統(tǒng)

    這篇文章主要介紹了如何用Python來(lái)搭建一個(gè)簡(jiǎn)單的推薦系統(tǒng),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-08-08
  • Python自動(dòng)化測(cè)試中yaml文件讀取操作

    Python自動(dòng)化測(cè)試中yaml文件讀取操作

    這篇文章主要介紹了Python自動(dòng)化測(cè)試中yaml文件讀取操作,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • Anaconda安裝OpenCV的方法圖文教程

    Anaconda安裝OpenCV的方法圖文教程

    在Anaconda里安裝OpenCV的方法有很多,下面這篇文章主要給大家介紹了關(guān)于Anaconda安裝OpenCV的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-09-09
  • python 實(shí)現(xiàn)表情識(shí)別

    python 實(shí)現(xiàn)表情識(shí)別

    這篇文章主要介紹了python 實(shí)現(xiàn)表情識(shí)別的示例代碼,幫助大家更好的理解和學(xué)習(xí)python,感興趣的朋友可以了解下
    2020-11-11
  • python被修飾的函數(shù)消失問(wèn)題解決(基于wraps函數(shù))

    python被修飾的函數(shù)消失問(wèn)題解決(基于wraps函數(shù))

    這篇文章主要介紹了python被修飾的函數(shù)消失問(wèn)題解決(基于wraps函數(shù)),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • 對(duì)Django外鍵關(guān)系的描述

    對(duì)Django外鍵關(guān)系的描述

    今天小編就為大家分享一篇對(duì)Django外鍵關(guān)系的描述,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-07-07
  • 使用python實(shí)現(xiàn)定時(shí)報(bào)天氣的示例代碼

    使用python實(shí)現(xiàn)定時(shí)報(bào)天氣的示例代碼

    本文主要介紹了使用python實(shí)現(xiàn)定時(shí)報(bào)天氣,只需要讓爬蟲(chóng)程序每天自動(dòng)為你發(fā)送,下面就詳細(xì)的介紹一下如何使用,感興趣的可以了解一下
    2021-11-11
  • 深入理解?python?虛擬機(jī)

    深入理解?python?虛擬機(jī)

    這篇文章主要介紹了深入理解?python?虛擬機(jī)的相關(guān)資料,需要的朋友可以參考下
    2023-04-04
  • pytorch自定義初始化權(quán)重的方法

    pytorch自定義初始化權(quán)重的方法

    今天小編就為大家分享一篇pytorch自定義初始化權(quán)重的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-08-08
  • python中的計(jì)時(shí)器timeit的使用方法

    python中的計(jì)時(shí)器timeit的使用方法

    本篇文章主要介紹了python中的計(jì)時(shí)器timeit的使用方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-10-10

最新評(píng)論