Hacktoberfest 2026:メンテナが10月に向けて印を付けた、オープンで初心者向けの issue。 Hacktoberfest の issue を見る

why run_coroutine_threadsafe so slow?

オープン
#510 コメント 0 件 リアクション 1 件 担当者 0 名 GitHub で見る

まだ誰も着手していません。

評価

難易度
4/5
見積もり時間
3〜5日
初心者へのやさしさ
25/100
issue の種類
バグ
明瞭さ
説明が足りない
活発さ
停滞
技術スタック
python
領域
backend

調査の方向性

まず、提供された2ループおよび1ループの例を uvloop 0.14.0、Python 3.6.5、指定されたプラットフォームで実行し、次に asyncio.run_coroutine_threadsafe と await my_sum() の前後のタイミングを比較します。完了とは、追加のスレッド間レイテンシの原因を特定するか、それが予想される理由を、焦点を絞った再現またはベンチマークを用いて文書化することです。

索引モデルが issue の本文から書いたものです。

説明

  • uvloop version: 0.14.0
  • Python version: 3.6.5
  • Platform: centos 6.3 cpu:Intel(R) Xeon(R) Gold 5218 CPU @ 2.30GHz

I have a need to run my code in two loop, demo code like below

import threading
import asyncio
import time
import traceback
import uvloop
asyncio.set_event_loop_policy(uvloop.EventLoopPolicy())

g_loop = asyncio.get_event_loop()
print("g_loop", id(g_loop), g_loop)

async def my_sum():
    result = 0
    for i in range(1000):
        result += 1

async def func():
    global g_loop

    try:
        while True:
            s = time.time()
#            await my_sum()
            future = asyncio.run_coroutine_threadsafe(my_sum(), g_loop)
            result = future.result(1)
            e = time.time()
            print("total", (e - s) * 1000 * 1000)
            await asyncio.sleep(0.00001)
    except Exception as e:
        print("in this======", traceback.format_exc())

def thread_loop():
    loop = asyncio.new_event_loop()
    print("local loop", id(loop))
    task = loop.create_task(func())
    loop.run_forever()

t = threading.Thread(target=thread_loop)
t.start()

g_loop.run_forever()
t.join()

then, the print time cost about 100us ~ 150us

total 107.52677917480469
total 100.13580322265625
total 154.97207641601562
total 144.48165893554688
total 141.62063598632812
total 135.18333435058594
total 174.99923706054688
total 99.89738464355469
total 174.7608184814453
total 102.04315185546875

but when I run my code in one loop

import threading
import asyncio
import time
import traceback
import uvloop
asyncio.set_event_loop_policy(uvloop.EventLoopPolicy())

g_loop = asyncio.get_event_loop()
print("g_loop", id(g_loop), g_loop)

async def my_sum():
    result = 0
    for i in range(1000):
        result += 1

async def func():
    global g_loop

    try:
        while True:
            s = time.time()
            await my_sum()
#            future = asyncio.run_coroutine_threadsafe(my_sum(), g_loop)
#            result = future.result(1)
            e = time.time()
            print("total", (e - s) * 1000 * 1000)
            await asyncio.sleep(0.00001)
    except Exception as e:
        print("in this======", traceback.format_exc())

def thread_loop():
    loop = asyncio.new_event_loop()
    print("local loop", id(loop))
    task = loop.create_task(func())
    loop.run_forever()

t = threading.Thread(target=thread_loop)
t.start()

g_loop.run_forever()
t.join()

the time cost about 40us ~ 80us

total 40.0543212890625
total 39.577484130859375
total 39.577484130859375
total 39.577484130859375
total 76.2939453125
total 40.0543212890625
total 39.10064697265625
total 81.53915405273438
total 40.0543212890625

Does change a thread need extra 60us ~ 70us? why so slow?

主要言語
Cython
スター
11.9k
フォーク
615
PR マージ指標
30日以内にマージされた PR はありません

コントリビューションガイド

このリポジトリのコントリビューションガイドは索引されていません

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

MagicStack/uvloop のほかの issue

MagicStack/uvloop の issue をすべて見る

似ている issue

Backend & API Design の issue をもっと見る

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。