亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

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

必要性

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

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

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

管道通信(Pipe)

1.通信原理

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

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

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

# 創(chuàng)建 管道
fd1, fd2 = Pipe()
def app1():
    print('1 啟動應(yīng)用1,請登錄')
    print('2 請求app2授權(quán)')
    fd1.send('app1 請求登錄')
    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 啟動應(yīng)用1,請登錄
2 請求app2授權(quán)
2.5
3 app2 app1 請求登錄
4 app2,發(fā)送完畢
5 ?? ('Dave', '123')
6 登錄成功: ('Dave', '123')
0
運(yùn)行結(jié)束

"""

消息隊列

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

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

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

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

# 以下模擬 雙色球
# 創(chuàng)建消息隊列
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é)束')

控制臺輸出 linux (windows無效)

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

共享內(nèi)存

1.通信原理

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

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

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(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)
功能: 開辟共享內(nèi)存
參數(shù): ctype 表示共享內(nèi)存空間類型 'i' 'f' 'c'
	data 共享內(nèi)存空間初始數(shù)據(jù)
返回值: 共享內(nèi)存對象

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

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

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

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

value 代碼 演示

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

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 開辟單一共享內(nèi)存空間
注意:共享內(nèi)存只能有一個值
"""

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

信號量(信號燈集)

1.通信原理

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

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

from multiprocessing import Semaphore

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

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

3.代碼演示

"""
信號量.py 信號量演示
思路: 信號量數(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 開始執(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é)束')

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

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 如何用Python來搭建一個簡單的推薦系統(tǒng)

    如何用Python來搭建一個簡單的推薦系統(tǒng)

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

    Python自動化測試中yaml文件讀取操作

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

    Anaconda安裝OpenCV的方法圖文教程

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

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

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

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

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

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

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

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

    本文主要介紹了使用python實(shí)現(xiàn)定時報天氣,只需要讓爬蟲程序每天自動為你發(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)重的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-08-08
  • python中的計時器timeit的使用方法

    python中的計時器timeit的使用方法

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

最新評論