1

私は一種の並列計算のために emacs/ielm でプロセスを実験しています。つまり、さまざまな計算のために多くのプロセスを開始し、すべてのプロセスが終了して結果を作成するのを待ちます。これを行うために、次の単純な関数を設定しました。

(defun testp ()
  (while (> (length (process-list)) 1)))

すべての子プロセスが開始された後に testp を呼び出し、再びコントロールを取得したら、結果を構成します。

  1. 子プロセスがない場合、testp はすぐに終了します。
  2. 少なくとも 1 つの子プロセスの testp ループがある場合: ok;
  3. すべての子プロセスが終了すると、testp はループし続けますが、これは良くありません。

どこが間違っているのか理解できるようにお願いできますか。

4

3 に答える 3

2

プロセスが終了した後、すぐに削除されるとは限りません。だから(process-list)まだそれをリストするかもしれません。ユーザー変数delete-exited-processesがこれを制御するので、それが に設定されていることを確認してくださいt。この関数list-processesは、終了したプロセスも明示的に削除するので、役立つ場合があります。

詳細については、マニュアルのプロセスに関する章を参照してください。

于 2013-09-23T14:49:48.863 に答える
2

Emacs はシングルスレッドであり、「安全なポイント」に到達するまで外部入力 (プロセスの状態の変化など) を処理しません。したがって、上記のループ (@juanleon が示唆するように) は「きつすぎる」です。を追加sleepします。

しかしset-process-sentinel、ビジー状態で待機するよりも、プロセスが終了したときに Emacs に通知されるように使用する方がよいでしょう。例えば:

  ...start a new process stored in proc...
  (push proc my-list-of-running-processes)
  (set-process-sentinel proc #'my-run-when-its-over)
  ...

(defun my-run-when-its-over (proc msg)
  (setq my-list-of-running-processes (delq proc my-list-of-running-processes))
  (unless my-list-of-running-processes
    (message "Haha!  all my processes are done!")))

process-listまた、関連のないプロセスが含まれる可能性があるため (たとえば、使用する場合や他のさまざまなものを使用する場合)、おそらく使用したくないことにも注意してください。M-x shellこれが、上記で使用した理由ですmy-list-of-running-processes

于 2013-09-24T12:54:18.797 に答える
0

Maybe the tight loop is not letting emacs do a proper process cleanup. My recommendation would be to apply a filter to the result of (process-list) (since if you have a runnning compilations, server, shell, etc. the process list won't be empty), to filter out processes different of those you are interested in, and also to add a small delay to the while ((sleep 0 500), for instance).

于 2013-09-23T07:06:19.610 に答える