Skip to content

Commit d08ed35

Browse files
massongitclaude
andcommitted
fix: multiprocessing.Pool(fork)をThreadPoolExecutorに置き換える
macOSでのpytest実行時に、マルチスレッドプロセス (pytest) からfork()した後、requestsがプロキシ設定を取得しようとするとSIGSEGVが発生する問題を修正する。 ThreadPoolExecutorはfork()しないためこのクラッシュが発生せず、またスレッドは同プロセスのメモリを共有するためrequests_mockもそのまま有効になる。 HTTPリクエストではI/O待機中にGILが解放されスレッドでも実質並列に実行できるため、multiprocessing.Poolより適切であり、結果として #5926 でforkを明示していた問題も根本から解消される (forkserver/spawn では requests_mock が子プロセスに引き継がれず、実際のHTTPリクエストが発生するという問題があったが、スレッドになるので発生しない)。 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent 9826072 commit d08ed35

1 file changed

Lines changed: 3 additions & 3 deletions

File tree

library/hatomap.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
from __future__ import annotations
22

33
import math
4-
import multiprocessing
54
import random
65
import string
6+
from concurrent.futures import ThreadPoolExecutor
77
from abc import ABCMeta, abstractmethod
88
from dataclasses import dataclass, field
99
from typing import List, Optional, Tuple
@@ -196,8 +196,8 @@ def request(self, bbox: WebMercatorPixelBBox) -> np.ndarray:
196196
{"x": x, "y": y, "z": bbox.zoom}
197197
)
198198
)
199-
with multiprocessing.get_context(method="fork").Pool(16) as p:
200-
imgs = list(p.imap(self._get_image_content, request_urls))
199+
with ThreadPoolExecutor(max_workers=16) as executor:
200+
imgs = list(executor.map(self._get_image_content, request_urls))
201201

202202
tile_width_cnt = rb_tilepx.tile.tile_x + 1 - tl_tilepx.tile.tile_x
203203
tile_height_cnt = rb_tilepx.tile.tile_y + 1 - tl_tilepx.tile.tile_y

0 commit comments

Comments
 (0)