1. 程式人生 > >python多程序通訊之訊息佇列

python多程序通訊之訊息佇列

在linux C中,訊息佇列可以通過key來建立,在使用某個佇列時,可根據key來獲取佇列,進而進行資料的收發;且佇列的前4個位元組,可用於判斷目標程序,不匹配則不接收,也就是多個程序可共用一個佇列進行訊息的收發。

在python中則不同,沒有key,直接get接收。這就要求每個佇列對應一個程序。可對queues.Queue進行一次繼承,新增需要的一些資訊,再建立自己的佇列;為使用方便,可為每個佇列寫一個收發函式。

from multiprocessing import queues


class VQueue(queues.Queue):
    """新增類說明"""
    def __init__(self, qid, name, size, ctx):
        """
        定製自己的訊息佇列
        :param qid: 佇列ID
        :param name: 佇列名稱
        :param size: 佇列大小
        :param ctx: 上下文
        """
        super().__init__(maxsize=size, ctx=ctx)
        if not isinstance(qid, int):
            raise TypeError('Process id must be int type')
        if not isinstance(name, str):
            raise TypeError('Process name must be str type')
        self.qid = qid
        self.name = name

    def __str__(self):
        """返回程序名字"""
        return self.name
import multiprocessing

from vv_lib.vv_queue.vqueue import VQueue

# 佇列編號、名稱、大小
queue_def = ((1, 'college queue', 20),
             (2, 'student queue', 20))


class MyQueues():
    def __init__(self):
        self.queues = []
        context = multiprocessing.get_context('spawn')
        for q in queue_def:
            self.queues.append(VQueue(q[0], q[1], q[2], context))


    # 每新增一個佇列,新增一對send、recv方法
    # 向佇列傳送訊息
    def ipc_snd_to_college(self, data):
        self.queues[0].put(data)


    # 從佇列接收訊息
    def ipc_rcv_from_college(self):
        return self.queues[0].get()


    # 向佇列傳送訊息
    def ipc_snd_to_student(self, data):
        self.queues[1].put(data)


    # 從佇列接收訊息
    def ipc_rcv_from_student(self):
        return self.queues[1].get()


class MyGlobal():
    def __init__(self):
        self.queues = MyQueues()

相關推薦

python程序通訊訊息佇列

在linux C中,訊息佇列可以通過key來建立,在使用某個佇列時,可根據key來獲取佇列,進而進行資料的收發;且佇列的前4個位元組,可用於判斷目標程序,不匹配則不接收,也就是多個程序可共用一個佇列進行訊息的收發。 在python中則不同,沒有key,直接get接收。這就要

程序通訊訊息佇列

下面是原始碼:#include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #include <errno.h> #include &

python程序通訊multiprocessing.Queue

multiprocessing.Queue()和queue.Queue()的區別 Queue.Queue是程序內非阻塞佇列,用於程序內的各函式模組或執行緒間通訊。 multiprocess.Queue是跨程序通訊佇列。但是不能用於multiprocessing.

Linux 學習筆記—程序通訊 訊息佇列、訊號量、共享記憶體的概念區別聯絡

2.5 訊息佇列(Message queues) 訊息佇列是核心地址空間中的內部連結串列,通過linux核心在各個程序直接傳遞內容,訊息順序地傳送到訊息佇列中,並以幾種不同的方式從佇列中獲得,每個訊息佇列可以用IPC識別符號唯一地進行識別。核心中的訊息佇列是通過

Linux程序通訊訊息佇列的雙向通訊

  上一篇部落格我寫了程序間通訊基於管道的通訊,但是管道的通訊無疑有很大的缺點,最顯著的就是隻能單向通訊,例如:server向client發訊息,client無法回覆;第二個就是隻能在有血緣關係的程序間進行通訊,雖然命名管道解決了第二點,但是第一點還是一個很大的

【Linux】Linux程序通訊訊息佇列

1、訊息佇列概念引入    訊息佇列提供了一個從一個程序向另外一個程序傳送一塊資料的方法每個資料塊都被認為是有一個型別,接收者程序接收的資料塊可以有不同的型別值訊息佇列也有管道一樣的不足,就是每個訊息的最大長度是有上限的(MSG

【Linux】程序通訊訊息佇列、訊號量和共享儲存

訊息佇列、訊號量和共享儲存是IPC(程序間通訊)的三種形式,它們功能不同,但有相似之處,下面先介紹它們的相似點,然後再逐一說明。 1、相似點 每個核心中的IPC結構(訊息佇列、訊號量和共享儲存)都用一個非負整數的識別符號加以引用,與檔案描述符不同,當一個

程序通訊訊息佇列

 最近發現訊息佇列的一些隱蔽的點,通過程式碼註釋記錄分享下。樣例來自https://www.cnblogs.com/52php/p/5862114.html,感謝。 接收端程式碼如下:#include <stdio.h>#include <stdlib.h&

swoole程序通訊訊息佇列

1. 相關函式 2. 與訊息佇列相關的核心引數 1. 引數 kernel.msgmnb = 4203520,訊息佇列的最大位元組數 kernel.msgmni = 64,最多允許建立多少個訊息佇列 kernel.msgmax = 8192,訊

【Linux】程序通訊訊息佇列

在上一篇部落格裡,我們學習了程序間通訊的一種方式,那就是管道,今天我們繼續學習另一種方式訊息佇列。 訊息佇列 一. 什麼是訊息佇列?   訊息佇列是訊息的連結串列,存放在核心中並由訊息佇列識別符號表示。   訊息佇列提供了一個從一個程序向另一個程

【Multiprocessing】Python程序記憶體共享資料佇列SMQueue

0x00 前言 自從先前研究了下Python的多程序計算(原文連結)之後, 深深地感受到多程序處理的美好,並決定運用到模型訓練時, 作為 feed data 的資料處理模組使用,實現工具類 SharedMemoryQueue。 但是眾所周知,python的程序間

IPC通訊------------訊息佇列詳解

訊息佇列(也叫做報文佇列)能夠克服早期unix通訊機制的一些缺點。作為早期unix通訊機制之一的訊號能夠傳送的資訊量有限,後來雖然POSIX 1003.1b在訊號的實時性方面作了拓廣,使得訊號在傳遞資訊量方面有了相當程度的改進,但是訊號這種通訊方式更像"即時"的通訊方式,它要

python程序併發multiprocessing

multiprocessing.Process multiprocessing包是Python中的多程序管理包。它與 threading.Thread類似,可以利用multiprocessing.Process物件來建立一個程序。該程序可以允許放在Python

IPC通訊訊息佇列、訊號量和共享記憶體

    有三種IPC我們稱作XSI IPC,即訊息佇列,訊號量以及共享儲存器。XSI IPC源自System V的IPC功能。由於XSI IPC不使用檔案系統的名稱空間,而是構造了它們自己的名字空間,

python程序通訊例項分析

作業系統會為每一個建立的程序分配一個獨立的地址空間,不同程序的地址空間是完全隔離的,因此如果不加其他的措施,他們完全感覺不到彼此的存在。那麼程序之間怎麼進行通訊?他們之間的關聯是怎樣的?實現原理是什麼?本文就來藉助Python簡單的聊一下程序之間的通訊?還是那句話,原理是相同的,希望能透過具體的例子來體會一下

python 程序通訊 訊息佇列

import multiprocessing import time #使用佇列,將訊息寫進佇列,需要的程序到佇列取 #佇列由父程序建立,子程序共享佇列 def write(qe): print("啟動子程序 write") for chr in ['A','B','C','D

程序程式設計程序通訊-管道和訊息佇列

1.程序間通訊 Linux作為一種新興的作業系統,幾乎支援所有的Unix下常用的程序間通訊方法:管道、訊息佇列、共享記憶體、訊號量、套介面等等。 2.管道 管道是程序間通訊中最古老的方式,它包括無名管道(或者匿名管道)和有名管道兩種,前者用於父程序和

Linux作業系統程序通訊——使用訊息緩衝佇列實現client程序與server程序之間的通訊

使用訊息緩衝佇列來實現client程序和server程序之間的通訊。  問題描述如下: server程序先建立一個關鍵字為SVKEY(如75)的訊息佇列,然後等待接收型別為REQ(如1)的訊息;在收到請求訊息後,它便顯示字串“serving for clien

Linux 工程式設計——程序通訊訊息佇列(Message Queues)

概述 訊息佇列提供了一種在兩個不相關的程序之間傳遞資料的簡單高效的方法,其特點如下: 1)訊息佇列可以實現訊息的隨機查詢。訊息不一定要以先進先出的次序讀取,程式設計時可以按訊息的型別讀取。 2)訊息佇列允許一個或多個程序向它寫入或者讀取訊息。 3)與無名管道、命名管道一

python爬蟲入門八:多程序/執行緒 python佇列Queue Python多執行緒(2)——執行緒同步機制 python學習筆記——多程序中共享記憶體Value & Array python 多程序 Python多程序 Python 使用multiprocessing 特別耗記

什麼是多執行緒/多程序 引用蟲師的解釋: 計算機程式只不過是磁碟中可執行的,二進位制(或其它型別)的資料。它們只有在被讀取到記憶體中,被作業系統呼叫的時候才開始它們的生命期。 程序(有時被稱為重量級程序)是程式的一次執行。每個程序都有自己的地址空間,記憶體,資料棧以及其它記錄其執行軌跡的輔助資料