精品熟女碰碰人人a久久,多姿,欧美欧美a v日韩中文字幕,日本福利片秋霞国产午夜,欧美成人禁片在线观看

Python 處理器通信

流程互通是指流程之間的數據交換。有必要在進程之間交換數據以開發并行應用程序。下圖顯示了多個子進程之間同步的各種通信機制

 

各種溝通機制

在本節中,我們將了解各種通信機制。機制如下所述 -

隊列

隊列可以與多進程程序一起使用。 多處理 模塊的queue類與 queue.queue 類相似。因此,可以使用相同的api。 多處理 .queue為我們提供了一個線程和進程安全的fifo(先進先出)進程之間的通信機制。

下面是一個簡單的例子,它來自python官方文檔的多處理,以理解queue類的多處理的概念。

from multiprocessing import process, queue
import queue
import random
def f(q):
   q.put([42, none, 'hello'])
def main():
   q = queue()
   p = process(target = f, args = (q,))
   p.start()
   print (q.get())
if __name__ == '__main__':
   main()

輸出

[42, none, 'hello']

管道

它是一種數據結構,用于在多進程程序中的進程之間進行通信。pipe()函數返回一個由管道連接的連接對象,默認情況下是雙工(雙向)。它以下列方式工作 -

  • 它返回一對連接對象,表示管道的兩端。

  • 每個對象都有兩個方法 - send() 和 recv() ,以便在進程之間進行通信。

下面是一個簡單的例子,它取自python官方文檔的多處理,以理解多處理的 pipe() 函數的概念。

from multiprocessing import process, pipe

def f(conn):
   conn.send([42, none, 'hello'])
   conn.close()

if __name__ == '__main__':
   parent_conn, child_conn = pipe()
   p = process(target = f, args = (child_conn,))
   p.start()
   print (parent_conn.recv())
   p.join()

產量

[42, none, 'hello']

manager

manager是一類多處理模塊,它提供了一種在所有用戶之間協調共享信息的方法。管理器對象控制服務器進程,該進程管理共享對象并允許其他進程操作它們。換句話說,管理者提供了一種創建可在不同流程之間共享的數據的方法。以下是經理對象的不同屬性

  • 管理器的主要屬性是控制管理共享對象的服務器進程。

  • 另一個重要屬性是在任何進程修改它時更新所有共享對象。

下面是一個示例,它使用manager對象在服務器進程中創建列表記錄,然后在該列表中添加新記錄。

import multiprocessing

def print_records(records):
   for record in records:
      print("name: {0}\nscore: {1}\n".format(record[0], record[1]))

def insert_record(record, records):
   records.append(record)
      print("a new record is added\n")

if __name__ == '__main__':
   with multiprocessing.manager() as manager:

      records = manager.list([('computers', 1), ('histoty', 5), ('hindi',9)])
      new_record = ('english', 3)

      p1 = multiprocessing.process(target = insert_record, args = (new_record, records))
      p2 = multiprocessing.process(target = print_records, args = (records,))
      p1.start()
      p1.join()
      p2.start()
      p2.join()

輸出

a new record is added

name: computers
score: 1

name: histoty
score: 5

name: hindi
score: 9

name: english
score: 3

管理器中命名空間的概念

manager class帶有命名空間的概念,這是一種跨多個進程共享多個屬性的快捷方法。命名空間沒有任何可以調用的公共方法,但它們具有可寫屬性。

以下python腳本示例幫助我們利用名稱空間在主進程和子進程之間共享數據 -

import multiprocessing

def mng_nasp(using_ns):

   using_ns.x +=5
   using_ns.y *= 10

if __name__ == '__main__':
   manager = multiprocessing.manager()
   using_ns = manager.namespace()
   using_ns.x = 1
   using_ns.y = 1

   print ('before', using_ns)
   p = multiprocessing.process(target = mng_nasp, args = (using_ns,))
   p.start()
   p.join()
   print ('after', using_ns)

產量

before namespace(x = 1, y = 1)
after namespace(x = 6, y = 10)

 

ctypes-array和value

多處理模塊提供array和value對象,用于將數據存儲在共享內存映射中。 array 是從共享內存分配的ctypes數組, value 是從共享內存分配的ctypes對象。

為了使用,從多處理導入process,value,array。

以下python腳本是一個從python文檔中獲取的示例,它利用ctypes array和value在進程之間共享一些數據。

def f(n, a):
   n.value = 3.1415927
   for i in range(len(a)):
   a[i] = -a[i]

if __name__ == '__main__':
   num = value('d', 0.0)
   arr = array('i', range(10))

   p = process(target = f, args = (num, arr))
   p.start()
   p.join()
   print (num.value)
   print (arr[:])

輸出

3.1415927
[0, -1, -2, -3, -4, -5, -6, -7, -8, -9]

 

通信順序進程(csp)

csp用于說明系統與具有并發模型的其他系統的交互。csp是一個通過消息傳遞編寫并發或程序的框架,因此它對描述并發性很有效。

 

python庫 - pycsp

為了實現csp中的核心原語,python有一個名為pycsp的庫。它使實現非常簡短和可讀,因此可以非常容易地理解它。以下是pycsp的基本流程網絡

在上面的pycsp過程網絡中,有兩個過程 - 過程1和過程2.這些過程通過兩個通道傳遞消息進行通信 - 通道1和通道2。

安裝pycsp

借助以下命令,我們可以安裝python庫pycsp

pip install pycsp

以下python腳本是一個相互并行運行兩個進程的簡單示例。它是在pycsp python libabary的幫助下完成的

from pycsp.parallel import *
import time
@process
def p1():
   time.sleep(1)
   print('p1 exiting')
@process
def p2():
   time.sleep(1)
   print('p2 exiting')
def main():
   parallel(p1(), p2())
   print('terminating')
if __name__ == '__main__':
   main()

在上面的腳本中,創建了兩個函數,即 p1 和 p2 ,然后使用 @process 進行修飾,以將它們轉換為進程。

輸出

p2 exiting
p1 exiting
terminating

下一節:python 事件驅動編程

相關文章