Python에서 부모와 포크 아동 프로세스간에 데이터를 어떻게 공유합니까?

StackOverflow https://stackoverflow.com/questions/218935

  •  03-07-2019
  •  | 
  •  

문제

나는 OS.Plock (OP) 함수를 사용하여 이것을 할 것이라고 확신하지만, 방법은 모른다. 또한 더 나은 방법이 있다면, 알아볼 것입니다. 코드 스 니펫은 매우 환영합니다.

도움이 되었습니까?

해결책

하위 프로세스 os.popen, os.system, os.spawn, popen2 및 명령을 대체합니다. ㅏ 배관의 간단한 예 다음과 같습니다.

p1 = Popen(["dmesg"], stdout=PIPE)
p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE)
output = p2.communicate()[0]

당신은 또한 사용할 수 있습니다 메모리 매핑 파일 프로세스 간의 공유 메모리에 대한 FLAG = MAP_SHARD를 사용합니다.

다중 프로세싱 둘 다 초록 파이프 그리고 공유 메모리 더 높은 레벨 인터페이스를 제공합니다. 처리 문서에서 가져온 :

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()   # prints "[42, None, 'hello']"
    p.join()

다른 팁

살펴보십시오 다중 프로세싱 Python 2.6의 새로운 모듈 (이전 버전에서도 사용할 수 있습니다. pyprocessing

예를 들어 파이프를 사용하여 정보를 전달하는 것을 설명하는 문서의 예는 다음과 같습니다.

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()   # prints "[42, None, 'hello']"
    p.join()

이것은 거의 파이썬 독립적입니다! Unix 간호 의사 소통의 전형적인 예입니다. 좋은 옵션 중 하나는 사용하는 것입니다 popen() 부모와 자식 프로세스 사이에 파이프를 열고 파이프를 따라 데이터/메시지를 앞뒤로 전달합니다.

살펴보십시오 subprocess 기준 치수, 하위 프로세스를 산란하면서 필요한 파이프를 자동으로 설정할 수 있습니다.

두 가지 옵션이 있습니다. os.popen* 에서 os 모듈 또는 사용할 수 있습니다 subprocess 동일한 효과에 대한 모듈. 파이썬 매뉴얼에는 예쁜 문서와 예제가 있습니다 포펜 그리고 하위 프로세스.

저수준 운영 체제 포킹을하고 파이프 사용을 피하고 싶다면 공유 메모리 매핑 파일도 사용할 수 있습니다. 이것은 사용만큼 좋지 않습니다 subprocess 또는 popen 파이프이지만 완전성에 대한 답을 포함하는 ...

거기에 여기에서 전체 예, 그러나 기본적으로 당신은 그것을 결합 할 수 있습니다 OS 파일 처리 및 MMAP 모듈 :

import mmap, os, tempfile
fd, tmpfile = tempfile.mkstemp()
os.write(fd, '\x00' * mmap.PAGESIZE)
os.lseek(fd, 0, os.SEEK_SET)
child_pid = os.fork()
if child_pid:
    buf = mmap.mmap(fd, mmap.PAGESIZE, mmap.MAP_SHARED, mmap.PROT_READ)
    os.waitpid(child_pid, 0)
    child_message = buf.readline()
    print(child_message)
    os.close(fd)
else:
    buf = mmap.mmap(fd, mmap.PAGESIZE, mmap.MAP_SHARED, mmap.PROT_WRITE)
    buf.write('testing\n')
    os.close(fd)
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top