Obtenha resposta de vários trabalhos no Gearman, mas aborte após um tempo limite
Em poucas palavras: Quero ter um tempo limite geral para uma chamada pararunTasks()
em um cliente Gearman.
Sinto que não posso ser a primeira pessoa a querer isso, mas não consigo encontrar um exemplo de como montá-lo.
Aqui está o que eu quero alcançar:
Em um script PHP, use o cliente Gearman para iniciar uma série de trabalhos em paraleloCada trabalho produzirá alguns resultados de pesquisa, que o script PHP precisará processarAlguns trabalhos podem levar algum tempo para serem executados, mas não quero esperar o mais lento. Em vez disso, depois de N milissegundos, desejo processar os resultados de todos os trabalhos concluídos e abortar ou ignorar aqueles que não o fizeram.Os requisitos 1 e 2 são bastante simples usando o PHP GearmanClientaddTask () erunTasks () métodos, mas isso bloqueia atétudo os trabalhos enviados são concluídos, portanto, não atendem ao requisito 3.
Aqui estão algumas abordagens que eu tentei até agora:
O tempo limite definido comsetTimeout () mede o tempo em que a conexão foiocioso, não é disso que estou interessado.Usando trabalhos ou tarefas em segundo plano, parece não haver nenhuma maneira de recuperar os dados retornados pelo trabalhador. Já existem várias perguntas sobre isso:1 2O loop de pesquisa personalizado no exemplo paraaddTaskStatus () é quase o que eu preciso, mas ele usa trabalhos em segundo plano, então, novamente, não consigo ver nenhum resultado. Ele também inclui o vago comentário "um método melhor seria usar retornos de chamada de evento", sem explicar o que significa retorno de chamada ou qual parte do exemplo eles substituiriam.As opções do cliente incluem um modo GEARMAN_CLIENT_NON_BLOCKING, mas não entendo como usá-lo e, se não estiver bloqueandorunTasks()
é diferente de usarsetTaskBackground()
ao invés desetTask()
.Vi sugestões de que a comunicação de retorno poderia usar apenas um mecanismo diferente, como um armazenamento de dados compartilhado, mas, nesse caso, eu também poderia abandonar o Gearman e criar uma solução personalizada com o RabbitMQ.