-
Notifications
You must be signed in to change notification settings - Fork 0
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
Implement BackgroundTaskCompletion and notification #290
Conversation
55bcb5f
to
6ee01da
Compare
通知の多言語対応のために一旦WIPに戻します |
これって今DispatchQueueに4個タスクがあったとして、バックグラウンドにした瞬間にその1つ目のタスクが実行されてたとしたら、それを止めるのはむりそうだけど、2つ目以降のタスク(のこり3つのタスク)は |
DispatchQueueに入っているジョブに対してsuspendはめっちゃよさそうです。 |
@shibukazu あ、もちろん、通知とかあった上でっていう意味やった! |
なるほどです。 |
@shibukazu このコミットでggml-small.en.binがおそらくshibukazuのローカル環境の何処かを指すようになっててしまってて、こっちでビルドできないから直してもらえるとたすかる! |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
いろいろ試したんだけど、自分の環境では、beginBackgroundTask
のexpirationHandler
が呼ばれる前に、バックグラウンドに入ったら2,3秒後にはアプリがキルされてしまってて、beginBackgroundTask
は単にsuspended状態(コードが何も実行されない状態)に入るまでの時間を伸ばすだけで、キルされる可能性はあるかなと思う。
これを回避するためにはやっぱり、このメソッドとかでバックグラウンドに入った瞬間を検知して、これとかで認識タスクを止めるしかないのかなと思う。
まあなんにしてもこのPRの範疇は超えるからこのPRはとりあえずこのままマージするようにする?
} | ||
let identifier = UIApplication.shared.beginBackgroundTask(expirationHandler: { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
一応これを見る感じ、中でも
UIApplication.shared.endBackgroundTask(identifier)
を読んだ方がよさそうかも?
バックグラウンドに入って2、3秒経過してすぐにキルされたってことですか? |
@shibukazu 通知はちゃんとでるんだけど、でた直後くらい |
ちなみに実機ですかね? |
@shibukazu 実機です! |
あとcancelに関しては
これを見た感じ始まってしまった認識タスクには影響できないっぽい..? |
30sという秒数が保証されていないとすると通知の文言を修正したいです。 |
@shibukazu 確かに始まったタスクはもう無理なのか.... |
本気でやろうと思えば、whisper_cppの モデル動いている途中にこれ読んだらどうなるかはわからんけど笑 |
キルすることはできるかもしれませんが、キルされたジョブを復元してDispatchQueueの先頭に入れ直すのが難しいと思います。 |
一応このPRにおける残りのタスクとしては
上記達成され次第マージでよろしいでしょうか? |
各タスクをDispatchWorkItemとしてラップして、このDispatchWorkItemを他のリストとかに別に保持しとけば、あとでフォアグラウンドに戻ったときにDispatchQueueに入れ直せるくない?リストからは本当に認識タスクが終わったタイミングで削除する的な。 というかまあDispatchWorkItem使わんでも必要な情報だけ適当なstruct二保存するだけでいい気もするけど |
OK 👍 |
なるほど、いまのclosureを配列として保持しておいて、キャンセルされた場合はQueueを再構成してあげるのが良さそうですね。(既存のQueueの任意の位置に入れるのは無理そう) |
@shibukazu そうそう、Queueの再編というのを書き忘れたけど、それを意図してた。closureを配列としてもつでもいいし、自分はstreamingRecognition関数の引数の値たちを保持しとけば、あとで同じクロージャーは再現できるかなと思ってた。
確かにこの問題があるのか... まあどっちにしろこれやるとすると割と重いタスクだし一生やらなさそう笑 |
add UIApplication.shared.endBackgroundTask to expiration handler
var body: some Scene { | ||
WindowGroup { | ||
StartView() | ||
.onChange(of: scenePhase) { phase in | ||
if phase == .background { | ||
if numRecognitionTasks > 0 { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
厳密にいったらスレッドセーフじゃなさそうなのと、グローバル変数よりはRecognizerのプロパティのほうがいいかな、とか思ったけど、なおすのめんどうだなのでとりあえずコメントだけ!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
numRecognitionTasksの書き換えはserialDispatchQueueの中でしか起きないので現状は安全ですが、確かにメインスレッドでも参照する以上、スレッドセーフであるべきですね。
Issueに切り出しておきます。
遅くなってすまん!LGTM! |
ごめんまじで手が滑って間違えてクローズしてもうた |
Related Issue
close #287
close #288
close #289
What
Memo