Python에서 부모와 포크 아동 프로세스간에 데이터를 어떻게 공유합니까?
문제
나는 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
기준 치수, 하위 프로세스를 산란하면서 필요한 파이프를 자동으로 설정할 수 있습니다.
저수준 운영 체제 포킹을하고 파이프 사용을 피하고 싶다면 공유 메모리 매핑 파일도 사용할 수 있습니다. 이것은 사용만큼 좋지 않습니다 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)