簡體   English   中英

並行運行兩個不同的進程py 3.8

[英]running two different proceses in parallel py 3.8

我想開發一個同時從兩個設備讀取輸入的系統。 每個進程目前獨立工作,但由於我需要同步它們,我希望它們都將 output 寫入同一個文件。

import multiprocessing as mp
from multiprocessing import Process
from multiprocessing import Pool
import time

# running the data aquisition from the screen
def Screen(fname):

    for x in range(1, 9):
        fname.write(str(x)+ '\n')
        fname.flush()
        time.sleep(0.5)
        print(x)

# running the data aquisition from the EEG 
def EEG(fname):

    for y in range(10, 19):
        fname.write(str(y)+ '\n')
        fname.flush()
        time.sleep(0.3)
        print(y)


# main program body #

# open the common file that the processes write to
fname = open('C:/Users/Yaron/Documents/Python Scripts/research/demofile.txt', 'w+')

pool = Pool(processes=2)

p1 = pool.map_async(Screen,fname)
p2 = pool.map_async(EEG,fname)

print ('end')

fname.close()

在多處理中,根據操作系統,您可能無法將打開的文件句柄傳遞給進程。 以下是適用於任何操作系統的代碼:

import multiprocessing as mp
import time

def Screen(fname,lock):
    with open(fname,'a') as f:
        for y in range(1,11):
            time.sleep(0.5)
            with lock:
                print(y)
                print(y,file=f,flush=True)

def EEG(fname,lock):
    with open(fname,'a') as f:
        for y in range(11, 21):
            time.sleep(0.3)
            with lock:
                print(y)
                print(y,file=f,flush=True)

if __name__ == '__main__':
    fname = 'demofile.txt'
    lock = mp.Lock()
    with open(fname,'w'): pass  # truncates existing file and closes it
    processes = [mp.Process(target=Screen,args=(fname,lock)),
                 mp.Process(target=EEG,args=(fname,lock))]
    s = time.perf_counter()
    for p in processes:
        p.start()
    for p in processes:
        p.join()
    print (f'end (time={time.perf_counter() - s}s)')

一些注意事項:

  • 在每個進程中打開文件。 例如,Windows 不會 fork() 進程,也不會繼承句柄。 句柄不能在進程之間傳遞。
  • 打開 append 的文件。 兩個進程將有兩個不同的文件指針。 Append 確保它每次都尋找到最后。
  • 使用序列化鎖保護文件訪問。 在主線程中創建鎖並將相同的鎖傳遞給每個進程。
  • 使用if __name__ == '__main__':在主線程中運行一次性代碼。 一些操作系統將腳本import其他進程,這樣可以防止代碼多次運行。
  • map_async 使用不正確。 它需要一個可迭代的 arguments 傳遞給 function。 相反,創建兩個進程,啟動它們,然后加入它們等待完成。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM