Die Rückgabe von org-babel resultiert aus einem asynchronen Aufruf

7

Ich experimentiere derzeit damit, mehr von meinem Entwicklungsworkflow in den Organisationsmodus zu versetzen, damit ich besser verfolgen kann, welche Tests ich durchgeführt habe. Einige der Schritte umfassen jedoch asynchrone Aufrufe von RPC-Diensten. Das folgende Snippet zeigt das Problem:

#+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>

Wie Sie sehen, stammt das Ergebnis aus der ersten Aufgabe. Was ich tun muss, ist das tatsächliche Ergebnis anzuhängen, sobald die Verarbeitung abgeschlossen ist. Gibt es eine Möglichkeit, dies zu erreichen?

stsquad
quelle
1
Abgesehen vom Titel ist nicht wirklich klar, was Ihre Frage ist. Bei der Beantwortung des Titels taucht diese Frage meiner Meinung nach häufig in der Org-E-Mail-Liste auf und die Antwort lautet "derzeit nicht unterstützt".
Mankoff
@mankoff: OK, ich habe die Frage umformuliert und vereinfacht, um zu versuchen, das Folgen zu vereinfachen. Ist das besser?
stsquad
en.wikipedia.org/wiki/Minimal_Working_Beispiel Warum nicht ein dreizeiliges Bash-Skript haben, das etwas Asynchrones zurückgibt, das jeder ausführen / testen / verstehen kann?
Mankoff
@mankoff: Nun, Bash ist von Natur aus synchron, nicht wahr? Ich habe das gesamte Build- und Upload-Material in ein Skript zusammengefasst, um es zu vereinfachen, aber die LAVA-Jobübermittlung erfolgt asynchron in Emacs.
stsquad
@mankoff: Wie ist das neue elisp einzige Beispiel?
stsquad

Antworten:

4

OK Lösen für das (asynchrone) Beispiel Ich habe mir diesen Hack ausgedacht. Es wäre schön, wenn ich automatisch den Namen des Quellblocks erhalten könnte, anstatt ihn als var wiederholen zu müssen.

** 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
stsquad
quelle
1
Hallo. Es gibt einen Beitrag von John Kitchin über eine Prototyplösung für Python-Codeblöcke, die für Sie interessant sein könnte.
dfeich