MagicStack / MagicStack/uvloop

why run_coroutine_threadsafe so slow?

Đang mở
#510 0 bình luận 1 reaction 0 người được giao Xem trên GitHub

Chưa có ai nhận issue này.

Ngôn ngữ chính
Cython
Star
11.9k
Fork
616
Chỉ số merge pull request
Không có pull request nào được merge trong 30 ngày

Mô tả

* **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?

Hướng dẫn đóng góp

Chưa lập chỉ mục được hướng dẫn đóng góp cho kho mã nguồn này

Bắt đầu từ đâu

  1. Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
  2. Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
  3. Fork repository và làm thay đổi trên một nhánh.
  4. Mở pull request có tham chiếu số hiệu của issue.

Hướng nghiên cứu

Bắt đầu bằng cách chạy các ví dụ hai vòng lặp và một vòng lặp được cung cấp với uvloop 0.14.0, Python 3.6.5 và nền tảng đã nêu, sau đó so sánh thời gian xung quanh asyncio.run_coroutine_threadsafe và await my_sum(). Hoàn thành nghĩa là xác định nguồn gốc của độ trễ bổ sung giữa các thread hoặc ghi lại lý do nó được dự kiến, kèm theo một bản tái hiện hoặc benchmark tập trung.

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Đánh giá

Công nghệ
python
Lĩnh vực
backend
Loại issue
Lỗi
Độ khó
4/5
Thời gian dự kiến
3-5 ngày
Mức độ hoạt động
Đình trệ
Độ rõ ràng
Cần làm rõ
Mức phù hợp với người mới
25/100

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.