python多進(jìn)程共享Array問題
目的
可以使用multiprocessing庫中的Array來實現(xiàn)多進(jìn)程共享Array。
multiprocessing庫是一個用于實現(xiàn)多進(jìn)程編程的庫,提供了與多進(jìn)程有關(guān)的同步,通信和進(jìn)程管理等功能。
在這個庫中,有一個Array類,用于創(chuàng)建一個多進(jìn)程共享的數(shù)組。
這樣,每個進(jìn)程都可以訪問這個共享的數(shù)組,從而實現(xiàn)數(shù)據(jù)共享和同步。
基礎(chǔ)知識介紹
1.multiprocessing.Array
- multiprocessing.Array是Python的多進(jìn)程庫中的一個數(shù)組對象,它用于在多個進(jìn)程之間共享數(shù)組數(shù)據(jù)。
- Array類型是在共享內(nèi)存中實現(xiàn)的,每個進(jìn)程可以操作該數(shù)組的值。這是在多個進(jìn)程間同步數(shù)據(jù)的一種常用方法,因為它們在同一內(nèi)存中運行。
- 使用multiprocessing.Array,你可以創(chuàng)建一個共享的數(shù)組,并在多個進(jìn)程中讀取和修改數(shù)組的值。
- 通過使用該模塊,您可以避免將數(shù)組通過管道或套接字從一個進(jìn)程傳遞到另一個進(jìn)程的問題。
2.multiprocessing.Array 函數(shù)接受以下參數(shù)
typecode
:字符串,表示數(shù)組元素的數(shù)據(jù)類型。可用的數(shù)據(jù)類型包括 'b'(布爾),'i'(整數(shù)),'f'(浮點數(shù)),'c'(單字符),'u'(Unicode字符)等。size
:整數(shù),表示數(shù)組的大小。lock
:布爾值,指示是否應(yīng)該為數(shù)組元素創(chuàng)建鎖(鎖定)。
以上參數(shù)中,前兩個是必需的,而后一個是可選的。
python多進(jìn)程共享一維Array
舉個例子,你可以使用multiprocessing庫中的Array創(chuàng)建一個整型數(shù)組,并在兩個進(jìn)程中分別執(zhí)行讀取和寫入操作,從而實現(xiàn)多進(jìn)程共享Array。
- 代碼
from multiprocessing import Process, Array import time def print_array(arr, n): while True: for i in range(n): print("Process {}: {}".format(i, arr[i])) time.sleep(1) test_count = 1 def set_array(arr, n): global test_count while True: for i in range(n): arr[i] = i + test_count time.sleep(1) test_count += 1 print(test_count) if __name__ == "__main__": arr = Array('i', [0, 0, 0, 0, 0, 0, 0, 0, 0]) n = len(arr) process1 = Process(target=print_array, args=(arr, n)) process2 = Process(target=set_array, args=(arr, n)) process1.start() process2.start() process1.join() process2.join()
這段代碼創(chuàng)建了兩個進(jìn)程:一個打印數(shù)組的進(jìn)程(print_array)和一個設(shè)置數(shù)組的進(jìn)程(set_array)。這兩個進(jìn)程同時運行,互不影響。
- print_array 進(jìn)程通過一個循環(huán)打印數(shù)組中的每一個元素,并在每次循環(huán)之后等待 1 秒。
- set_array 進(jìn)程通過一個循環(huán)設(shè)置數(shù)組中的每一個元素,并在每次循環(huán)之后等待 1 秒。它設(shè)置的數(shù)組的每一個元素的值都是經(jīng)過累加的。
通過 Array 對象,兩個進(jìn)程共享同一個數(shù)組。需要注意的是,在 Python 中多進(jìn)程之間共享數(shù)據(jù)時需要特殊處理,以保證同步與數(shù)據(jù)完整性。這里使用的 multiprocessing.Array 可以方便地共享數(shù)組。
程序的主流程是創(chuàng)建兩個進(jìn)程,啟動它們并等待它們結(jié)束。當(dāng)兩個進(jìn)程都結(jié)束后,程序結(jié)束。
- 運行結(jié)果:
Process 0: 0
Process 1: 0
Process 2: 0
Process 3: 0
Process 4: 0
Process 5: 0
Process 6: 0
Process 7: 0
Process 8: 0
2
Process 0: 1
Process 1: 3
Process 2: 4
Process 3: 5
Process 4: 6
Process 5: 7
Process 6: 8
Process 7: 9
Process 8: 10
Process 0: 2
Process 1: 3
Process 2: 4
3Process 3: 5Process 4: 6
Process 5: 7
Process 6: 8
Process 7: 9
Process 8: 10
4
Process 0: 3
Process 1: 4
Process 2: 6
Process 3: 7
Process 4: 8
Process 5: 9
Process 6: 10
Process 7: 11
Process 8: 12
python多進(jìn)程共享多維Array
在 Python 中,使用multiprocessing模塊的Array來共享多維數(shù)組在多進(jìn)程中需要用到一些特殊的技巧。
首先,你需要定義一個共享內(nèi)存,并在多個進(jìn)程中共享該內(nèi)存。
例如,如果你想要共享一個3維數(shù)組,可以定義一個二維共享內(nèi)存數(shù)組,然后再在每個進(jìn)程中訪問它,它仍然是共享的。
下面是一個示例代碼,該代碼演示了如何在兩個進(jìn)程中共享一個3維數(shù)組:
- 代碼
from multiprocessing import Process, Array import time import numpy as np def print_array(arr, shape): while True: print("Process: \n") print(np.array(arr).reshape(shape)) time.sleep(1) def set_array(arr, shape): while True: np.random.shuffle(arr) time.sleep(1) print("Shuffled the array") if __name__ == "__main__": shape = (2, 3, 4) arr = Array('d', np.arange(np.prod(shape))) process1 = Process(target=print_array, args=(arr, shape)) process2 = Process(target=set_array, args=(arr, shape)) process1.start() process2.start() process1.join() process2.join()
在上面的代碼中,我們使用了multiprocessing庫中的Array來實現(xiàn)多進(jìn)程共享一個3維數(shù)組,它們可以在兩個獨立的進(jìn)程中讀取和修改這個數(shù)組。
打印結(jié)果可能是一個不斷變化的3維數(shù)組,每隔1秒進(jìn)行重新洗牌。
- 運行結(jié)果
Process:
[[[ 0. 1. 2. 3.]
[ 4. 5. 6. 7.]
[ 8. 9. 10. 11.]][[12. 13. 14. 15.]
[16. 17. 18. 19.]
[20. 21. 22. 23.]]]
警告信息
UserWarning: you are shuffling a 'SynchronizedArray' object which is not a subclass of 'Sequence'; `shuffle` is not guaranteed to behave correctly. E.g., non-numpy array/tensor objects with view semantics may contain duplicates after shuffling.
np.random.shuffle(arr)
np.random.shuffle是numpy庫中的一個函數(shù),它可以對一維數(shù)組進(jìn)行隨機(jī)打亂。
語法:
numpy.random.shuffle(x)
參數(shù):
- x:需要打亂的一維數(shù)組。
返回值:
- 無返回值,直接對數(shù)組進(jìn)行打亂。
該函數(shù)在使用時需要注意,不保證所有情況下都會正確實現(xiàn)。
例如,具有視圖語義的非numpy數(shù)組/張量對象在洗牌后可能會包含重復(fù)的元素。
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python基于property實現(xiàn)類的特性操作示例
這篇文章主要介紹了Python基于property實現(xiàn)類的特性,結(jié)合實例形式分析了使用property實現(xiàn)類的特性相關(guān)操作技巧與注意事項,需要的朋友可以參考下2018-06-06pytorch中的nn.ZeroPad2d()零填充函數(shù)實例詳解
這篇文章主要介紹了pytorch中的nn.ZeroPad2d()零填充函數(shù)實例詳解,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-04-04Linux RedHat下安裝Python2.7開發(fā)環(huán)境
這篇文章主要為大家詳細(xì)介紹了Linux RedHat下安裝Python2.7、pip、ipython環(huán)境、eclipse和PyDev環(huán)境,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-05-05