Jadual Kandungan
Kesimpulan
Rumah pembangunan bahagian belakang Tutorial Python Memperkenalkan BlockBuster: adakah gelung acara asyncio saya disekat?

Memperkenalkan BlockBuster: adakah gelung acara asyncio saya disekat?

Jan 09, 2025 am 06:29 AM

Introducing BlockBuster: is my asyncio event loop blocked?

Python 3.5 memperkenalkan I/O tak segerak sebagai alternatif kepada utas untuk mengendalikan konkurensi. Kelebihan I/O asynchronous dan pelaksanaan asyncio dalam Python ialah dengan tidak menghasilkan rangkaian sistem pengendalian intensif memori, sistem menggunakan lebih sedikit sumber dan lebih berskala. Tambahan pula, dalam asyncio, titik penjadualan ditakrifkan dengan jelas melalui sintaks await, manakala dalam konkurensi berasaskan benang, GIL mungkin dikeluarkan pada titik kod yang tidak dapat diramalkan. Akibatnya, sistem konkurensi berasaskan asyncio lebih mudah difahami dan nyahpepijat. Akhirnya, tugas asyncio boleh dibatalkan, yang tidak mudah dilakukan apabila menggunakan benang.

Walau bagaimanapun, untuk benar-benar mendapat manfaat daripada kelebihan ini, adalah penting untuk mengelak daripada menyekat panggilan dalam coroutine async. Menyekat panggilan boleh menjadi panggilan rangkaian, panggilan sistem fail, sleep panggilan, dsb. Panggilan menyekat ini berbahaya kerana, di bawah hud, asyncio menggunakan gelung acara satu benang untuk menjalankan coroutine secara serentak. Jadi, jika anda membuat panggilan menyekat dalam coroutine, ia menyekat keseluruhan gelung acara dan semua coroutine, yang menjejaskan prestasi keseluruhan aplikasi anda.

Berikut ialah contoh panggilan menyekat yang menghalang kod daripada dilaksanakan serentak:

import asyncio
import datetime
import time

async def example(name):
    print(f"{datetime.datetime.now()}: {name} start")
    time.sleep(1)  # time.sleep 是一个阻塞函数
    print(f"{datetime.datetime.now()}: {name} stop")

async def main():
    await asyncio.gather(example("1"), example("2"))

asyncio.run(main())
Salin selepas log masuk
Salin selepas log masuk

Hasil larian adalah serupa dengan:

<code>2025-01-07 18:50:15.327677: 1 start
2025-01-07 18:50:16.328330: 1 stop
2025-01-07 18:50:16.328404: 2 start
2025-01-07 18:50:17.333159: 2 stop</code>
Salin selepas log masuk
Salin selepas log masuk

Seperti yang anda lihat, kedua-dua coroutine tidak berjalan serentak.

Untuk mengatasi masalah ini, anda perlu menggunakan setara tanpa menyekat atau menangguhkan pelaksanaan ke kumpulan benang:

import asyncio
import datetime
import time

async def example(name):
    print(f"{datetime.datetime.now()}: {name} start")
    await asyncio.sleep(1)  # 将阻塞的 time.sleep 调用替换为非阻塞的 asyncio.sleep 协程
    print(f"{datetime.datetime.now()}: {name} stop")

async def main():
    await asyncio.gather(example("1"), example("2"))

asyncio.run(main())
Salin selepas log masuk
Salin selepas log masuk

Hasil larian adalah serupa dengan:

<code>2025-01-07 18:53:53.579738: 1 start
2025-01-07 18:53:53.579797: 2 start
2025-01-07 18:53:54.580463: 1 stop
2025-01-07 18:53:54.580572: 2 stop</code>
Salin selepas log masuk

Di sini dua coroutine dijalankan serentak.

Kini masalahnya ialah bukan selalu mudah untuk mengenal pasti sama ada sesuatu kaedah menyekat atau tidak. Terutama jika pangkalan kod besar atau menggunakan perpustakaan pihak ketiga. Kadangkala, menyekat panggilan dibuat di bahagian dalam kod.

Sebagai contoh, adakah kod ini menyekat?

import blockbuster
from importlib.metadata import version

async def get_version():
    return version("blockbuster")
Salin selepas log masuk

Adakah Python memuatkan metadata pakej ke dalam memori semasa permulaan? Adakah ia dilakukan apabila modul blockbuster dimuatkan? Atau apabila kita memanggil version()? Adakah keputusan dicache dan adakah panggilan berikutnya akan tidak disekat? Jawapan yang betul dilakukan apabila memanggil version(), yang melibatkan membaca fail METADATA pakej yang dipasang. Dan hasilnya tidak di-cache. Oleh itu, version() ialah panggilan menyekat dan harus sentiasa ditangguhkan ke urutan. Sukar untuk mengetahui fakta ini tanpa menggali kod importlib.

Satu cara untuk mengesan panggilan menyekat ialah mengaktifkan mod nyahpepijat asyncio untuk mengelog panggilan menyekat yang mengambil masa terlalu lama. Tetapi ini bukan pendekatan yang paling cekap, kerana banyak masa sekatan yang lebih pendek daripada tamat masa pencetus masih akan menjejaskan prestasi, dan masa sekatan dalam ujian/pembangunan mungkin berbeza daripada dalam pengeluaran. Sebagai contoh, panggilan pangkalan data mungkin mengambil masa yang lebih lama dalam persekitaran pengeluaran jika pangkalan data mesti mengambil sejumlah besar data.

Di sinilah BlockBuster masuk! Apabila diaktifkan, BlockBuster akan menampal beberapa kaedah rangka kerja Python menyekat yang akan membuang ralat jika ia dipanggil dari gelung acara asyncio. Kaedah tampalan lalai termasuk kaedah modul os, io, time, socket dan sqlite. Untuk senarai lengkap kaedah yang dikesan oleh BlockBuster, lihat readme projek. Anda kemudian boleh mengaktifkan BlockBuster dalam ujian unit atau mod pembangunan untuk menangkap sebarang panggilan yang menyekat dan membetulkannya. Jika anda tahu pustaka BlockHound yang hebat untuk JVM, ia adalah prinsip yang sama, tetapi untuk Python. BlockHound merupakan sumber inspirasi yang hebat untuk BlockBuster, terima kasih kepada pencipta.

Mari lihat cara menggunakan BlockBuster pada coretan kod sekatan di atas.

Pertama, kita perlu memasang pakej blockbuster

import asyncio
import datetime
import time

async def example(name):
    print(f"{datetime.datetime.now()}: {name} start")
    time.sleep(1)  # time.sleep 是一个阻塞函数
    print(f"{datetime.datetime.now()}: {name} stop")

async def main():
    await asyncio.gather(example("1"), example("2"))

asyncio.run(main())
Salin selepas log masuk
Salin selepas log masuk

Kami kemudiannya boleh menggunakan lekapan pytest dan kaedah blockbuster_ctx() untuk mengaktifkan BlockBuster pada permulaan setiap ujian dan menyahaktifkannya semasa teardown.

<code>2025-01-07 18:50:15.327677: 1 start
2025-01-07 18:50:16.328330: 1 stop
2025-01-07 18:50:16.328404: 2 start
2025-01-07 18:50:17.333159: 2 stop</code>
Salin selepas log masuk
Salin selepas log masuk

Jika anda menjalankan ini dengan pytest anda akan mendapat

import asyncio
import datetime
import time

async def example(name):
    print(f"{datetime.datetime.now()}: {name} start")
    await asyncio.sleep(1)  # 将阻塞的 time.sleep 调用替换为非阻塞的 asyncio.sleep 协程
    print(f"{datetime.datetime.now()}: {name} stop")

async def main():
    await asyncio.gather(example("1"), example("2"))

asyncio.run(main())
Salin selepas log masuk
Salin selepas log masuk

Nota: Biasanya, dalam projek sebenar, lekapan blockbuster() akan disediakan dalam fail conftest.py.

Kesimpulan

Saya percaya BlockBuster sangat berguna dalam projek asyncio. Ia telah membantu saya mengesan banyak isu panggilan menyekat dalam projek yang telah saya usahakan. Tetapi ia bukan ubat penawar. Khususnya, sesetengah perpustakaan pihak ketiga tidak menggunakan kaedah rangka kerja Python untuk berinteraksi dengan rangkaian atau sistem fail, sebaliknya membungkus perpustakaan C. Untuk perpustakaan ini, anda boleh menambah peraturan dalam persediaan ujian anda untuk mencetuskan panggilan menyekat ke perpustakaan ini. BlockBuster juga merupakan sumber terbuka: sumbangan amat dialu-alukan untuk menambah peraturan untuk perpustakaan kegemaran anda dalam projek teras. Jika anda melihat isu dan bidang untuk penambahbaikan, saya ingin menerima maklum balas anda dalam penjejak isu projek.

Beberapa pautan:

  • Projek GitHub
  • Soalan
  • Pakej pada Pypi

Atas ialah kandungan terperinci Memperkenalkan BlockBuster: adakah gelung acara asyncio saya disekat?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Tutorial Java
1664
14
Tutorial PHP
1266
29
Tutorial C#
1239
24
Python vs C: Aplikasi dan kes penggunaan dibandingkan Python vs C: Aplikasi dan kes penggunaan dibandingkan Apr 12, 2025 am 12:01 AM

Python sesuai untuk sains data, pembangunan web dan tugas automasi, manakala C sesuai untuk pengaturcaraan sistem, pembangunan permainan dan sistem tertanam. Python terkenal dengan kesederhanaan dan ekosistem yang kuat, manakala C dikenali dengan keupayaan kawalan dan keupayaan kawalan yang mendasari.

Rancangan Python 2 jam: Pendekatan yang realistik Rancangan Python 2 jam: Pendekatan yang realistik Apr 11, 2025 am 12:04 AM

Anda boleh mempelajari konsep pengaturcaraan asas dan kemahiran Python dalam masa 2 jam. 1. Belajar Pembolehubah dan Jenis Data, 2.

Python: Permainan, GUI, dan banyak lagi Python: Permainan, GUI, dan banyak lagi Apr 13, 2025 am 12:14 AM

Python cemerlang dalam permainan dan pembangunan GUI. 1) Pembangunan permainan menggunakan pygame, menyediakan lukisan, audio dan fungsi lain, yang sesuai untuk membuat permainan 2D. 2) Pembangunan GUI boleh memilih tkinter atau pyqt. TKInter adalah mudah dan mudah digunakan, PYQT mempunyai fungsi yang kaya dan sesuai untuk pembangunan profesional.

Python vs C: Lengkung pembelajaran dan kemudahan penggunaan Python vs C: Lengkung pembelajaran dan kemudahan penggunaan Apr 19, 2025 am 12:20 AM

Python lebih mudah dipelajari dan digunakan, manakala C lebih kuat tetapi kompleks. 1. Sintaks Python adalah ringkas dan sesuai untuk pemula. Penaipan dinamik dan pengurusan memori automatik menjadikannya mudah digunakan, tetapi boleh menyebabkan kesilapan runtime. 2.C menyediakan kawalan peringkat rendah dan ciri-ciri canggih, sesuai untuk aplikasi berprestasi tinggi, tetapi mempunyai ambang pembelajaran yang tinggi dan memerlukan memori manual dan pengurusan keselamatan jenis.

Berapa banyak python yang boleh anda pelajari dalam 2 jam? Berapa banyak python yang boleh anda pelajari dalam 2 jam? Apr 09, 2025 pm 04:33 PM

Anda boleh mempelajari asas -asas Python dalam masa dua jam. 1. Belajar pembolehubah dan jenis data, 2. Struktur kawalan induk seperti jika pernyataan dan gelung, 3 memahami definisi dan penggunaan fungsi. Ini akan membantu anda mula menulis program python mudah.

Python dan Masa: Memanfaatkan masa belajar anda Python dan Masa: Memanfaatkan masa belajar anda Apr 14, 2025 am 12:02 AM

Untuk memaksimumkan kecekapan pembelajaran Python dalam masa yang terhad, anda boleh menggunakan modul, masa, dan modul Python. 1. Modul DateTime digunakan untuk merakam dan merancang masa pembelajaran. 2. Modul Masa membantu menetapkan kajian dan masa rehat. 3. Modul Jadual secara automatik mengatur tugas pembelajaran mingguan.

Python: Automasi, skrip, dan pengurusan tugas Python: Automasi, skrip, dan pengurusan tugas Apr 16, 2025 am 12:14 AM

Python cemerlang dalam automasi, skrip, dan pengurusan tugas. 1) Automasi: Sandaran fail direalisasikan melalui perpustakaan standard seperti OS dan Shutil. 2) Penulisan Skrip: Gunakan Perpustakaan Psutil untuk memantau sumber sistem. 3) Pengurusan Tugas: Gunakan perpustakaan jadual untuk menjadualkan tugas. Kemudahan penggunaan Python dan sokongan perpustakaan yang kaya menjadikannya alat pilihan di kawasan ini.

Python: meneroka aplikasi utamanya Python: meneroka aplikasi utamanya Apr 10, 2025 am 09:41 AM

Python digunakan secara meluas dalam bidang pembangunan web, sains data, pembelajaran mesin, automasi dan skrip. 1) Dalam pembangunan web, kerangka Django dan Flask memudahkan proses pembangunan. 2) Dalam bidang sains data dan pembelajaran mesin, numpy, panda, scikit-learn dan perpustakaan tensorflow memberikan sokongan yang kuat. 3) Dari segi automasi dan skrip, Python sesuai untuk tugas -tugas seperti ujian automatik dan pengurusan sistem.

See all articles