Rumah  >  Artikel  >  pembangunan bahagian belakang  >  GIL hound: memburu kesesakan dalam Python serentak

GIL hound: memburu kesesakan dalam Python serentak

WBOY
WBOYke hadapan
2024-03-02 16:19:37530semak imbas

GIL 猎犬:追捕并发 Python 中的瓶颈

GIL: Masalah dalam Concurrency Python

GIL (Global Interpreter Lock) ialah mekanisme dalam python yang memastikan hanya satu thread boleh melaksanakan bytecode pada satu masa. Ini penting dalam memastikan Python benang penterjemah selamat, tetapi ia juga mengehadkan konkurensikeupayaan program berbilang benang, terutamanya apabila tugas intensif pengiraan terlibat.

Cara GIL berfungsi

GIL berfungsi dengan mengawal akses kepada objek Python. Apabila benang memperoleh GIL, ia menghalang semua utas lain daripada mengakses sebarang objek Python, termasuk pembolehubah, kelas dan fungsi global dan tempatan. Ini memastikan bahawa penterjemah Python tidak menyebabkan keadaan perlumbaan disebabkan oleh manipulasi serentak objek yang sama.

Impak GIL

GIL mempunyai kesan berikut pada program Python serentak:

  • Prestasi berbilang benang yang lemah: GIL mengehadkan keselarian program berbilang benang kerana hanya satu utas boleh melaksanakan kod Python pada masa yang sama. Ini menjadikan multithreading hampir tidak berguna untuk tugas intensif CPU.
  • Kebuntuan: GIL mungkin menyebabkan kebuntuan kerana benang yang menahan GIL mungkin menunggu benang lain melepaskan kunci yang dipegangnya.
  • Peningkatan overhed: Pemerolehan dan pelepasan GIL akan meningkatkan overhed program, yang penting terutamanya untuk program yang kerap menukar thread.

Mengatasi batasan GIL

Walaupun ada batasan ini, terdapat beberapa strategi yang boleh digunakan untuk mengatasi batasan GIL:

1. Pelbagai proses:

Multiprocess mencipta berbilang contoh penterjemah Python, masing-masing dengan GIL sendiri. Ini menghapuskan batasan GIL antara proses, membenarkan pemprosesan selari yang benar. Walau bagaimanapun, menggunakan pelbagai proses memerlukan pengendalian perkongsian data dan komunikasi antara proses yang teliti.

Contoh kod:

import multiprocessing

def worker(num):
# 执行密集计算任务
return num * num

if __name__ == "__main__":
pool = multiprocessing.Pool(4)# 创建具有 4 个进程的进程池
results = pool.map(worker, range(1000000))
pool.close()
pool.join()

2. Sambungan CPython:

GIL dilaksanakan oleh CPython, penterjemah standard untuk Python. GIL boleh dipintas dengan menulis sambungan

C/C++ untuk berinteraksi secara langsung dengan sistem pengendalian yang mendasari. Ini memerlukan kemahiran pengaturcaraan tahap yang lebih tinggi, tetapi boleh meningkatkan prestasi konkurensi dengan ketara.

Contoh kod:

#include <Python.h>

PyObject *my_function(PyObject *self, PyObject *args) {
// 执行密集计算任务,无需 GIL 保护
// ...

Py_INCREF(Py_None);
return Py_None;
}

static PyMethodDef my_methods[] = {
{"my_function", my_function, METH_VARARGS, "My function"},
{NULL, NULL, 0, NULL}
};

PyMODINIT_FUNC initmymodule(void) {
Py_InitModule("mymodule", my_methods);
}

3. Keluaran GIL:

GIL adalah pilihan dan boleh dilepaskan dalam keadaan tertentu. Dengan menggunakan fungsi

, GIL boleh dilepaskan buat sementara waktu. Ini membolehkan utas lain memperoleh GIL dan melaksanakan tugas semasa keluaran. with 语句或通过调用 sys.settrace()

Contoh kod:

import sys

def worker():
# 执行密集计算任务
pass

if __name__ == "__main__":
sys.settrace(None)# 禁用追踪函数,释放 GIL
threads = []
for _ in range(4):
threads.append(threading.Thread(target=worker))
for thread in threads:
thread.start()
for thread in threads:
thread.join()

Kesimpulan

GIL adalah pertimbangan penting untuk

pengaturcaraan serentak dalam Python. Dengan memahami cara ia berfungsi dan impaknya, dan menggunakan strategi yang sesuai untuk mengatasi batasannya, anda boleh meningkatkan prestasi serentak program Python anda dan mengurangkan kesesakan. Memandangkan perkakasan komputer terus berkembang, batasan GIL mungkin akan menjadi lebih jelas, jadi adalah penting untuk meneroka dan menggunakan teknik ini untuk memaksimumkan prestasi program Python anda.

Atas ialah kandungan terperinci GIL hound: memburu kesesakan dalam Python serentak. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:lsjlt.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam