Como você compartilhar dados entre um pai e um processo filho bifurcada em Python?

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

  •  03-07-2019
  •  | 
  •  

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.

Foi útil?

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)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top