πΉ Π§Π΅ΠΌ ΠΎΡΠ»ΠΈΡΠ°ΡΡΡΡ concurrency ΠΈ parallelism β ΠΈ ΠΊΠ°ΠΊ asyncio + threadpool ΠΈΠ³ΡΠ°ΡΡ Π²ΠΌΠ΅ΡΡΠ΅? πΈ concurrency ΡΠ΅ΡΠ°Π΅Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ ΠΏΡΠΎΡΡΠ°ΠΈΠ²Π°Π½ΠΈΡ: ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠΏΡΠ°Π²Π»ΡΡΡ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎΠΌ Π·Π°Π΄Π°Ρ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ, ΡΡΠΎΠ±Ρ Π½Π΅ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°ΡΡ ΠΏΠΎΡΠΎΠΊ ΠΏΡΠΈ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠΈ I/O (input/output). πΈ parallelism β ΡΠ΅Π°Π»ΡΠ½ΠΎΠ΅ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΠΎΠ΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° ΡΠ°Π·Π½ΡΡ
ΡΠ΄ΡΠ°Ρ
CPU (central processing unit); Π½ΡΠΆΠ΅Π½ Π΄Π»Ρ ΡΡΠΊΠΎΡΠ΅Π½ΠΈΡ CPU-bound ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ, ΠΈΠ½Π°ΡΠ΅ ΠΌΠ½ΠΎΠ³ΠΎΠ·Π°Π΄Π°ΡΠ½ΠΎΡΡΡ Π½Π΅ Π΄Π°ΡΡ ΠΏΡΠΈΡΠΎΡΡΠ°. πΈ ΠΡΠ°ΠΊΡΠΈΠΊΠ°: Π΄Π»Ρ I/O-bound ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ asyncio; Π΄Π»Ρ Π±Π»ΠΎΠΊΠΈΡΡΡΡΠΈΡ
ΠΈΠ»ΠΈ CPU-bound ΡΡΠ½ΠΊΡΠΈΠΉ β ΠΎΡΠΏΡΠ°Π²Π»ΡΠΉΡΠ΅ ΠΈΡ
Π² threadpool (ThreadPoolExecutor) ΠΈΠ»ΠΈ Π² process pool. asyncio ΡΠΏΡΠ°Π²Π»ΡΠ΅Ρ ΠΊΠΎΡΡΡΠΈΠ½Π°ΠΌΠΈ, threadpool Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ Π±Π»ΠΎΠΊΠΈΡΡΡΡΠΈΠ΅ Π²ΡΠ·ΠΎΠ²Ρ. import asyncio from concurrent.futures import ThreadPoolExecutor def cpu_bound(x): return x*x async def main(): loop = asyncio.get_running_loop() with ThreadPoolExecutor() as tp: res = await loop.run_in_executor(tp, cpu_bound, 10) print(res) asyncio.run(main()) π ΠΠΎΡΠΎΡΠΊΠΎ: concurrency β parallelism β ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡΡΠΉΡΠ΅ asyncio Π΄Π»Ρ I/O ΠΈ threadpool
πΉ ΠΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΠΎΡΡΡ vs ΠΊΠΎΠ½ΠΊΡΡΠ΅Π½ΡΠ½ΠΎΡΡΡ: python-ΠΏΡΠ°ΠΊΡΠΈΠΊΠ°
ΠΡΠ΅ΡΠ°ΠΡΠ΅ΡΠ°
~1 ΠΌΠΈΠ½