Pergunta

Eu tenho um aplicativo GUI python que usa uma função de longa duração a partir de um .so / .dll que chama através ctypes.

Eu estou procurando uma maneira de se comunicar com a função enquanto ele está executando em um thread ou processo separado, para que eu possa solicitá-lo para terminar mais cedo (o que requer algum trabalho no lado do C antes de retornar um resultado parcial). Acho que isso vai precisar de algum tipo de recepção de sinal ou ler a partir de tubos, mas eu quero mantê-lo o mais simples possível.

O que você considera a melhor abordagem para resolver este tipo de problema? Eu sou capaz de alterar o código em ambos o python e os lados C.

Foi útil?

Solução

Há duas partes que você precisa para responder aqui: um se como se comunicar entre os dois processos (o GUI e o processo de execução da função), eo outro é como mudar a sua função para que ele responde a solicitações assíncronas ( "oh, eu tenho dito que apenas o retorno que eu tenho").

Fazendo a resposta à segunda questão, provavelmente, ditar a resposta à primeira. Você poderia fazê-lo por sinais (caso em que você começa um manipulador de sinal que recebe o controle do processo, pode procurar instruções mais detalhadas em outros lugares, e mudar suas estruturas de dados internos antes de retornar controle para a sua função), ou você poderia ter sua função monitorar uma interface de controle para comandos (a cada milissegundo, verificação para ver se há uma espera de comando, e se houver, ver o que é).

No primeiro caso, você iria querer manuseio ANSI C sinal (sinal (), sighandler_t), no segundo você provavelmente quer um tubo ou similar (pipe () e selecione ()).

Outras dicas

Você menciona que você pode mudar ambos os lados C e Python. Para evitar ter que escrever qualquer sockets ou código de sinal em C, pode ser mais fácil para quebrar a grande função C em 3 funções separadas menores que realizam a instalação, uma pequena parcela de trabalho, e limpeza. A parcela de trabalho deve estar entre cerca de 1 ms e 1 segundo tempo de execução para encontrar um equilíbrio entre agilidade e baixo custo operacional. Pode ser difícil para quebrar cálculos em até mesmo pedaços como este na cara de mudar o tamanho dos dados, mas você teria o mesmo desafio em uma única função grande que também fez I / O.

Escrever um processo de trabalho em Python que chama as 3 funções através ctypes. Tem o processo de trabalho verificar um href="http://docs.python.org/library/queue.html" rel="nofollow noreferrer"> Queue objeto

Se você estiver em * nix registrar um manipulador de sinal para SIGUSR1 ou SIGINT em seu programa C, em seguida, a partir de Python uso os.kill para enviar o sinal.

Você disse que:. Sinais e tubos

Ele não tem que ser muito complexa, mas vai ser um inferno de muito mais fácil se você usar uma estrutura já existente do que se você tentar rolar o seu próprio.

scroll top