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.

questionAnswers(2)

yourAnswerToTheQuestion