Python 并行运行两个不同的进程py 3.8

Python 并行运行两个不同的进程py 3.8,python,Python,我想开发一个同时从两个设备读取输入的系统。每个进程目前都独立工作,但由于我需要同步它们,我希望它们都将输出写入同一个文件 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

我想开发一个同时从两个设备读取输入的系统。每个进程目前都独立工作,但由于我需要同步它们,我希望它们都将输出写入同一个文件

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确保每次都搜索到末尾
  • 使用序列化锁保护文件访问。在主线程中创建锁,并将相同的锁传递给每个进程
  • 如果使用
    在主线程中运行一次性代码。一些操作系统在其他进程中导入脚本,这样可以防止代码多次运行
  • 映射异步未正确使用。它需要一组参数才能传递给函数。相反,创建这两个进程,启动它们,并加入它们以等待完成

会发生什么?你在哪里写入文件?您可以在这些进程之间共享一个队列,并让另一个进程将队列内容写入文件。大家好,谢谢您的帮助,它可以工作!现在我可以添加我的例程并查看组合的数据集。Thaks伙计们!这是非常有益的。我将工作这些选项,看看哪个工程的最好!