非同期呼び出しからorg-babelの結果を返す


7

現在、私の開発ワークフローを組織モードに移行する実験を行っているので、行ったテストをより正確に追跡できます。ただし、一部の手順にはRPCサービスへの非同期呼び出しが含まれます。次のスニペットは問題を示しています。

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

ご覧のとおり、結果は最初のタスクからのものです。処理が完了したら、実際の結果を追加する必要があります。これを達成する方法はありますか?


1
タイトルは別として、質問が何であるかは実際には明確ではありません。タイトルに答えると、この質問は組織のメーリングリストに頻繁に出てくると思います。答えは「現在サポートされていません」。
mankoff 2014年

@mankoff:わかりましたわかりやすくするために質問を書き直して簡略化しました。それは良いですか?
stsquad 2014年

en.wikipedia.org/wiki/Minimal_Working_Example誰でも実行/テスト/理解できる非同期の何かを返す3行のbashスクリプトを作成しないのはなぜですか?
mankoff 2014年

@mankoff:よくbashは本質的に同期ですよね?すべてのビルドとアップロードを1つのスクリプトにラップして簡略化しましたが、LAVAジョブの送信はemacs内で非同期に行われるものです。
stsquad 2014年

@mankoff:新しいelispのみの例はどうですか?
stsquad 2014年

回答:


4

わかりました(非同期)の例の解決私はこのハックを思いつきました。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

1
こんにちは。John Kitchinによる、あなたにとって興味深いPythonコードブロックのプロトタイプソリューションについての投稿があります。
dfeich 2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.