Como você compartilhar dados entre um pai e um processo filho bifurcada em Python?
Pergunta
Eu tenho certeza que se poderia fazer isso usando a função os.plock (op), mas não tenho idéia de como. Além disso, se há uma maneira melhor, eu ficaria grato para descobrir. trechos de código são muito bem-vindos.
Solução
Subprocess substitui os.popen, os.system, os.spawn, popen2 e comandos. A exemplo simples para tubulação seria:
p1 = Popen(["dmesg"], stdout=PIPE)
p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE)
output = p2.communicate()[0]
Você também pode usar um memória mapeada arquivo com a bandeira = MAP_SHARED para memória compartilhada entre processos.
multiprocessamento resumos tanto tubos e compartilhada memória e fornece uma interface de nível superior. Retiradas da documentação de processamento:
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()
Outras dicas
Dê uma olhada na multiprocessamento módulo novo em Python 2.6 (também disponível para versões anteriores de um pyprocessing
Aqui está um exemplo dos documentos que ilustram a informação que passa através de um tubo, por exemplo:
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()
Isso é muito bonito Python independente! É um exemplo clássico de comunicação Unix entre processos. Uma boa opção é usar popen()
para abrir um cachimbo entre os processos pai e filho, e passar dados / mensagens de volta e para trás ao longo do tubo.
Dê uma olhada na subprocess
módulo , que pode configurar os encanamentos necessários automaticamente durante a desova processos filhos.
Você tem duas opções: os.popen*
no módulo os
, ou você pode usar o módulo subprocess
para o mesmo efeito. O manual Python tem documentação bonita e exemplos para popen e subprocess .
Se você está fazendo de baixo nível de bifurcação sistema operacional e realmente quer evitar o uso de tubulações, é possível usar arquivos mapeados na memória compartilhada também. Isto não é quase tão bom como o uso de subprocess
ou popen
tubos, mas incluindo a resposta para a completude ...
Há um exemplo completo aqui , mas, basicamente, você pode combinar o arquivo oS manuseio e mmap módulos:
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)