Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

複数エンジン対応: DEFAULT_ENGINE_INFOSに登録されたエンジンのプロセスをすべて起動する(Promise版) #750

Merged

Conversation

aoirint
Copy link
Member

@aoirint aoirint commented Mar 10, 2022

内容

#741 の別バージョン(コールバックではなくPromiseを使った)の実装になります。こちらでは、エディタがエンジンのプロセスを管理していないとき、エディタが終了しないという #741 の不具合を修正しています。 #741 でも修正しました。

可読性向上のための変更です。

マージの想定としては、不具合のある #741 の次に このPR または、このPRのみをマージすることを想定しています。

  • 手元での動作確認手順
    • VOICEVOXエンジン 0.11.3・COEIROINKエンジン c0.2.0+v0.10.preview.0を.envに追加
    • COEIROINK Ver. 1.0.1を起動、同梱されたCOEIROINKエンジンの起動完了を待機
    • npm run electron:serveを実行
    • 閉じるボタンを押して、VOICEVOXエディタ・VOICEVOXエンジンのプロセスが正常終了することを確認

エンジンプロセスのキルの流れ

#654#741 では、エンジンプロセスをキルする処理をコールバックを使って書いていましたが、このPRではPromiseで実装しています。

アプリケーションのウインドウがすべて閉じられ、app.quitが呼び出されたとき、before-quitイベントが発火します。

before-quitイベントのハンドラでは、event.preventDefaultを同期的に呼び出すことでアプリケーションの終了を回避することができます。

実装では、キルしなければならないエンジンプロセスが1つ以上ある場合、before-quitイベントを同期的にキャンセルし、エンジンプロセス終了後に非同期にapp.quitを再呼び出ししています。これにより、エンジンプロセスが生存したままエディタが終了することを防ぎ、エンジンプロセスの終了を待機してからエディタが終了するようにしています。

#654#741 では、エンジンプロセスのキルを非同期に実行しつつ、before-quitイベントを同期的にキャンセルする関数(killEngineとその呼び出し元のこと)を実装するため、
可読性が落ちる(と思っている)のを承知でコールバックを使っていましたが、戻り値を工夫すればPromiseで書けることに気づいたので書き直してみました。

関連 Issue

スクリーンショット・動画など

その他

src/background.ts Outdated Show resolved Hide resolved
@aoirint
Copy link
Member Author

aoirint commented Mar 11, 2022

#741 マージによるコンフリクトを解消してWindows 10上での動作を確認しました。

Copy link
Member

@Segu-g Segu-g left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

少し気になったところを質問しました

とても読みやすくなっていていいと思います!

src/background.ts Outdated Show resolved Hide resolved
src/background.ts Outdated Show resolved Hide resolved
@Segu-g
Copy link
Member

Segu-g commented Mar 14, 2022

プロセスの未起動やプロセスの終了を同期的に知らせるためにprocessKillStartedを返していますがこれって同期的に返す必要はありますか?「既にresolveされている」と解釈しても良さそうだと思いました

@aoirint
Copy link
Member Author

aoirint commented Mar 14, 2022

@Segu-g

プロセスの未起動やプロセスの終了を同期的に知らせるためにprocessKillStartedを返していますがこれって同期的に返す必要はありますか?

before-quitイベントのevent.preventDefault()を同期的に呼び出す必要があるため、同期的に返すようにしています。
Electronの仕様として、before-quitイベントのハンドラには非同期関数を使用できないという認識です。

@Segu-g
Copy link
Member

Segu-g commented Mar 15, 2022

@aoirint

before-quitイベントのevent.preventDefault()を同期的に呼び出す必要があるため、同期的に返すようにしています。 Electronの仕様として、before-quitイベントのハンドラには非同期関数を使用できないという認識です。

確かにそうでした!他に場所がないので仕方がないとはいえ、before-quitが2回呼ばれるので同期的に分岐しないとしょうがないですね....

Copy link
Member

@Hiroshiba Hiroshiba left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

改めて読んでみてコメントしてみました!
たぶんだいぶすらっとすると思います・・・!

src/background.ts Outdated Show resolved Hide resolved
src/background.ts Outdated Show resolved Hide resolved
@Hiroshiba
Copy link
Member

こちら、マージできればと思います!
一旦マージするか、修正をお待ちするかでちょっと迷っているので、お忙しければ申し訳ないのですがコメント頂けますと幸いです・・・!

(マージできればみんなでリファクタリングとかもできると思うので!)

@Hiroshiba
Copy link
Member

@aoirint さん
こちらいかがでしょう👀
お忙しいようでしたらいったんマージして、こちらでガッとリファクタリングしちゃいたいなと・・・!

Copy link
Member

@Hiroshiba Hiroshiba left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM!!!

めちゃくちゃ見通しが良くなった気がします!!

@Hiroshiba
Copy link
Member

もしよかったら @Segu-g さんも見て頂けると・・・!!

Copy link
Member

@Segu-g Segu-g left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Electronの終了系イベントについて理解していないので見当違いなことを言っているかもしれませんがbefore-quitevent.preventDefault()を呼んでreturnした際に、window-all-closedが再度発火し、エンジンが終了するまで何度もbefore-quitが呼ばれているように見えます.

何度も呼んでもPromiseがいずれ解決されるなら問題ないのですが、これは想定された動作でしょうか?

src/background.ts Outdated Show resolved Hide resolved
Co-authored-by: Segu <51497552+Segu-g@users.noreply.github.com>
src/background.ts Outdated Show resolved Hide resolved
@Hiroshiba
Copy link
Member

エンジンが終了するまで何度もbefore-quitが呼ばれているように見えます.

ちゃんとわかってないのですが、まあ少なくとも以前と同じ処理がされそうなので大丈夫・・・なはず・・・!

@aoirint
Copy link
Member Author

aoirint commented Aug 10, 2022

#750 (comment)

そうですね、複数エンジン化前にも、もともとwindow-all-closedは2回呼ばれていたと思います。

Xボタンを押したときにwindow.destroyとapp.quitとが両方呼ばれているのかもです。。
OSによって挙動が違う可能性もありそうです。

過去のPRで終了操作をしてもVOICEVOXが終了できないより、動作に問題ないなら2回呼ばれていてもいい、という方向にした気がします!
(直せそうなら直したい・・・)

…ne-process-container-promise

engineKey to engineId
@aoirint
Copy link
Member Author

aoirint commented Aug 10, 2022

engineKeyからengineIdへのリネーム #871 でコンフリクトが起きていたのを修正しました!

@Hiroshiba
Copy link
Member

Hiroshiba commented Aug 10, 2022

修正ありがとうございます!
正直起動・終了シーケンスは、何が正しいのか、今VOICEVOXはどうなっているのかわからないので、整理したいですよね・・・・・・。

@Segu-g さん、もしよければまた見て頂けると・・・!

Copy link
Member

@Segu-g Segu-g left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM!

@Segu-g
Copy link
Member

Segu-g commented Aug 11, 2022

そうですね、複数エンジン化前にも、もともとwindow-all-closedは2回呼ばれていたと思います。

app.quitが非同期に呼ばれるせいで呼ばれるまでの間にwindow-all-closedが呼ばれているのかなと考えていましたが、元からだったんですね.試しにapp.quitを何度もキャンセルしてもwindow-all-closedは2回以上呼ばれませんでした.

終了イベント辺りはCommand + QとかCLOSE_WINDOWの複数の経路があるからややこしくなってますね....

@Hiroshiba
Copy link
Member

Hiroshiba commented Aug 11, 2022

起動シーケンス含むライフサイクルについて、とりあえず可視化するissueを作ってみました。

@Hiroshiba
Copy link
Member

マージします!!

@Hiroshiba Hiroshiba merged commit a845b5a into VOICEVOX:main Aug 11, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants