Retornando resultados de org-babel de uma chamada assíncrona


7

Atualmente, estou experimentando mover mais do meu fluxo de trabalho de desenvolvimento para o modo organizacional, para que eu possa acompanhar melhor os testes que fiz. No entanto, algumas das etapas envolvem chamadas assíncronas para serviços RPC. O seguinte trecho mostra o problema:

#+name: simple-async-example
#+begin_src emacs-lisp 
  (async-start
     ;; What to do in the child process
     (lambda ()
       (message "This is a test")
       (sleep-for 3)
       222)

     ;; What to do when it finishes
     (lambda (result)
       (format "Async process done - result should be 222: %s" result)))
#+end_src

#+RESULTS: simple-async-example
: #<process emacs>

Como você pode ver, o resultado vem da primeira tarefa. O que preciso fazer é anexar o resultado real depois que o processamento for concluído. Existe alguma maneira de conseguir isso?


11
Além do título, não está claro qual é a sua pergunta. Respondendo ao título, acho que essa pergunta aparece frequentemente na lista de e-mails da organização e a resposta "não é suportada no momento".
Mankoff

@mankoff: OK. Eu reformulei e simplifiquei a pergunta para tentar facilitar o acompanhamento. Isto é melhor?
Stsquad

pt.wikipedia.org/wiki/Minimal_Working_Example Por que não ter um script bash de 3 linhas que retorne algo assíncrono que qualquer um possa executar / testar / entender?
Mankoff

@ mankoff: bem bash é inerentemente síncrona, não é? Eu envolvi todo o material de compilação e upload em um script para simplificá-lo, mas o envio de trabalhos da LAVA é algo que acontece de forma assíncrona no emacs.
Stsquad

@mankoff: Como está o novo exemplo do elisp?
Stsquad

Respostas:


4

OK Resolvendo o exemplo (assíncrono) que criei esse hack. Seria bom se eu pudesse obter automaticamente o nome do bloco de origem ao invés de repeti-lo como um var.

** Post-modify the org-result
#+name: simple-async-with-post-modify
#+begin_src emacs-lisp :var this-buffer=(buffer-name (current-buffer)) this-name="simple-async-with-post-modify"
  (async-start
     ;; What to do in the child process
   `(lambda ()
     (message "This is a test")
     (sleep-for 3)
     ,(async-inject-variables "this-buffer")
     ,(async-inject-variables "this-name")
     (list
        (cons 'buffer this-buffer)
        (cons 'name this-name)
        (cons 'result 222)))

     ;; What to do when it finishes
   (lambda (result)
     (let ((buf (cdr (assoc 'buffer result)))
           (name (cdr (assoc 'name result)))
           (res (cdr (assoc 'result result))))
       (save-excursion
         (with-current-buffer buf
           (org-babel-goto-named-result name)
           (next-line)
           (goto-char (org-babel-result-end))
           (org-babel-insert-result (format "we got: %s" res)))))))
#+end_src

#+RESULTS: simple-async-with-post-modify
: #<process emacs>
: we got: 222

11
Oi. Há uma postagem de John Kitchin discutindo uma solução de protótipo para blocos de código python que pode ser interessante para você.
dfeich
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.