0

私は python 3.7.2 asyncio ベースのアプリケーションを持っています。いくつかのスレッド情報を公開するエンドポイントがあります。

threads_info = {}
for thread in enumerate():
    threads_info[thread.__str__()] = traceback.format_stack(sys._current_frames()[thread.ident])

メイン スレッド以外のスレッドが実行されていないことはわかっていますが、エンドポイントにクエリを実行すると、この奇妙な ThreadPoolExecutor が表示されます。たった 1 つのワーカーから始まり、増え続けます。

ここに画像の説明を入力

なぜ、どのように、この ThreadPoolExecutor とは何ですか? おそらく、コードのどこで作成されたのか、またはどのパッケージが作成したのかを確認する方法はありますか?

アプリの実行に使用する Dockerfile:

FROM python:3.7.2-alpine as base

FROM base as builder
RUN mkdir /install
WORKDIR /install
COPY requirements /requirements
RUN apk add \
    "gcc>8.2.0" \
    "g++>8.2.0" \
    "libffi-dev>3.2.1" \
    "musl-dev>1.1.20"
RUN pip install --install-option="--prefix=/install" -r /requirements

FROM base
RUN apk add --no-cache procps
COPY --from=builder /install /usr/local
COPY src /app
WORKDIR /app
RUN mkdir logs
ENTRYPOINT ["python", "-u", "app.py"]
EXPOSE 80/tcp

私の要件ファイル:

quart==0.8.1
aiohttp==3.5.4
cchardet==2.1.4
aiodns==1.2.0
requests==2.21.0
psutil==5.6.1
4

2 に答える 2

2

なぜ、どのように、この ThreadPoolExecutor とは何ですか?

ThreadPoolExecutorconcurrent.futuresモジュールによって提供されるスレッド プールの実装です。別のスレッドに渡すことにより、同期コードの非同期実行に使用されます。プールの目的は、個別のタスクごとにスレッドを作成して参加する際の待ち時間を回避することです。代わりに、プールはワーカー スレッドを 1 回だけ作成し、後で使用できるようにプールに保持します。プール内のスレッドの最大数は構成可能で、デフォルトはコア数に 5 を掛けた値になります。

ThreadPoolExecutorコードに表示されるスレッドは、使用しているライブラリの 1 つによってインスタンス化されたスレッドに属しています。具体的には、asyncio はメソッドで使用するエグゼキュータを作成しますrun_in_executor。このエグゼキューターは、asyncio 自体によって使用され、OS が提供する DNS 解決など、ネイティブに非同期インターフェイスを持たない呼び出しに非同期インターフェイスを提供します。

一般に、重要なサードパーティ ライブラリを使用する場合、自分のコードだけがスレッドを作成するとは限りません。ライブ スレッドを反復処理するときは、作成していないスレッドを単に無視します。これは、たとえば作成したスレッドをThreadオブジェクトのカスタム属性でマークすることで実現できます。

于 2019-03-21T09:26:40.483 に答える