Skip to content

Commit 7f2fb64

Browse files
committed
手で走らせた回を、ワーカーの待ち行列からも外す
画面の「今すぐ実行」は行列を通さずその場で走らせるので、その回が行列で待っていた 場合に残ったままになっていた。あとでワーカーが起きたときにもう一度同じ回が流れ、 枠を 1 回ぶん余計に食う。 起こせたら行列からも外す。流している最中の塊に居ても外す(押されたのは その回そのものなので、どちらに居るかは関係が無い)。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
1 parent f62dbe7 commit 7f2fb64

4 files changed

Lines changed: 53 additions & 2 deletions

File tree

CLAUDE.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -470,6 +470,10 @@ GeoNames 全世界地名辞典 = `geonames`(いずれも 348 言語版・195 か
470470
人に直させる価値が無い)
471471
- **収集を消したら行列からも外す**(`collect.remove`)。消えた収集を抱えた
472472
ままだと、そのワーカーは起こそうとして 404 を踏み続ける
473+
- **画面の「今すぐ実行」は行列を通さず、その場で走らせる**(相手はワーカーが
474+
選ぶまま)。**起こせたら行列からも外す**(`start_collection_bake`
475+
`workers.done`)—— 外さないと、待っていたぶんがあとでもう一度流れて、
476+
枠を 1 回ぶん余計に食う。行列と塊のどちらに居ても外す
473477
- **時計を待たずに起こせる**(`main.wake_worker` / 画面の「今すぐ起こす」)。
474478
**枠が明いているうちに回しておきたい、が普通に起きる** —— 次の起動まで待つと、
475479
待っているあいだに他の依頼が枠を食う(実測で、外からの 1 回が 5 時間枠を

app/main.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -440,6 +440,10 @@ def start_collection_bake(name: str, sweep: str | None = None) -> dict:
440440
441441
**どの巡回を起こしたかは定義側に控える**(`pending_sweep`)。取り込みは収集の
442442
名前しか運べないので、素材を作る側はそこを読む。
443+
444+
**起こせたら、ワーカーの待ち行列からも外す**(`workers.done`)。画面の
445+
「今すぐ実行」は行列を通さずその場で走らせるので、外さないと**待っていた
446+
ぶんがあとでもう一度流れる**(枠を 1 回ぶん余計に食う)。
443447
"""
444448
from app.views.admin import TRIGGER_URL, trigger_run
445449

@@ -457,6 +461,10 @@ def start_collection_bake(name: str, sweep: str | None = None) -> dict:
457461
# (押した巡回ではないものが走る)
458462
collect.mark_pending(name, this.name)
459463
trigger_run(name)
464+
# **行列に居たなら外す。** どの道で走ったかに関わらず、その回はもう走っている
465+
if worker := getattr(this, "worker", ""):
466+
with suppress(Exception):
467+
workers.done(worker, name, this.name)
460468
# **起こせたときだけ予定を進める** —— 混んでいて断られたのに次回へ送ると、
461469
# その回は黙って飛ばされる(trigger_run が例外にするのでここへは来ない)
462470
return collect.to_public(collect.mark_started(name, this.name))

app/workers.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -312,11 +312,17 @@ def last_at(name: str) -> str:
312312

313313

314314
def done(name: str, collection: str, sweep: str) -> None:
315-
"""流し終えた 1 件を塊から外す。"""
315+
"""流し終えた 1 件を外す。**塊からも行列からも**。
316+
317+
**行列のほうも外すのは、待っているあいだに手で走らされることがあるから**
318+
(画面の「今すぐ実行」)。残しておくと、そのワーカーが起きたときにもう一度
319+
同じ回が流れる —— 枠を 1 回ぶん余計に食う。
320+
"""
316321
state = _queue_all()
317322
slot = _slot(state, name)
318323
made = _entry(collection, sweep)
319-
slot["batch"] = [e for e in slot["batch"] if not _same(made, e)]
324+
for key in ("queue", "batch"):
325+
slot[key] = [e for e in slot[key] if not _same(made, e)]
320326
_queue_save(state)
321327

322328

tests/test_workers.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -496,6 +496,39 @@ async def broken(_asked, _messages):
496496
assert not workers.full_until("antigravity")
497497

498498

499+
class TestRunningItByHandInstead:
500+
"""画面の「今すぐ実行」は**行列を通さず、その場で走らせる**。
501+
502+
行列に居たぶんは、その場で外す —— 外さないと、あとでワーカーが起きたときに
503+
もう一度同じ回が流れて、枠を 1 回ぶん余計に食う。
504+
"""
505+
506+
def test_a_hand_run_takes_it_out_of_the_queue(self, enabled, monkeypatch):
507+
from app import collect, main
508+
509+
monkeypatch.setenv("CHIEZO_NOTES_DIR", str(enabled / "corpus"))
510+
monkeypatch.setattr("app.views.admin.TRIGGER_URL", "http://trigger")
511+
monkeypatch.setattr("app.views.admin.trigger_run", lambda _name: None)
512+
workers.save([workers.Worker("精査", (workers.Step("codex"),))])
513+
collect.create("news", prompt="p", interval_minutes=60,
514+
sweeps=[{"name": "ざっと", "worker": "精査"}])
515+
workers.enqueue("精査", "news", "ざっと", "2026-01-01T00:00:00+00:00")
516+
assert workers.queued("精査")
517+
518+
main.start_collection_bake("news", "ざっと")
519+
520+
assert workers.queued("精査") == []
521+
522+
def test_the_queue_is_cleared_from_either_list(self, enabled):
523+
"""流している最中の塊に居ても外す(押されたのはその回そのもの)。"""
524+
workers.enqueue("精査", "news", "ざっと", "2026-01-01T00:00:00+00:00")
525+
workers.claim("精査", 1, "2026-01-01T00:00:00+00:00")
526+
527+
workers.done("精査", "news", "ざっと")
528+
529+
assert workers.queued("精査") == []
530+
531+
499532
class TestWakingItByHand:
500533
"""時計を待たずに 1 本流す(`main.wake_worker` / 画面の「今すぐ起こす」)。
501534

0 commit comments

Comments
 (0)