лучший механизм для наблюдения за выходом из процесса асинхронного вызова / Fabri c? - PullRequest
0 голосов
/ 04 мая 2020

У меня есть блок кода, похожий на то, что ниже. Он работает так, как я ожидаю / хочу, но я хотел бы иметь возможность периодически проверять / распечатывать stderr / stdout этих фоновых / асинхронных c процессов. Из чтения документов кажется, что это возможно через потоки, но те немногие вещи, которые я пробовал, не принесли мне ничего полезного. Очень обобщенно c, я бы хотел сделать что-то вроде:

  1. запустить эти три процесса в фоновом режиме
  2. , пока они все еще работают, запустить некоторые другие команды на удаленном хосте (для проверки загрузки ЦП или чего-либо еще)
  3. также, пока они еще работают, продолжайте выполнять локальный код (возможно, запуск других процессов)
  4. , когда все они будут завершены, продолжайте делать вещи.

Я получил работу # 1 и # 4, но я не 'определил правильное расположение / комбинацию join() и все, что дает мне доступ к stderr / stdout потоки, которые, я уверен, будет содержать атрибут promise.runner.stdout.

promises, results = {}, {}
results = {}

with fabric.Connection(cfg['sim_host'], connect_timeout=15) as c:
    with c.cd(cfg['sim_dir']):
        cards =  ['convert_rp', 'convert_lc', 'convert_fixed']
        for card in cards:
            promises[card] = c.run(cmds[card], asynchronous=True)  ## launch my async commands

        for card in cards:
            results[card] = promises[card].join()      ## join and wait for all to finish

        for card in cards:
            print (f"output from {card}:{results[card].stdout}\n")     ## print the output

return results    
...