Теперь Кью работает в режиме чтения

Мы сохранили весь контент, но добавить что-то новое уже нельзя

Как в потоках python обойти GIL?

(создание процесса создаёт много накладных расходов и код НЕ ускоряется от параллельных вычислений, а даже замедляется)
ПрограммированиеPython+1
Максим Горохов
  ·   · 10,8 K
Openstack DevOps and IBM/Informix Certified DBA...  · 2 февр 2023
Многопроцессорная обработка VS многопоточность. 
Самый популярный способ - попробовать использовать многопроцессорный подход, Вы используете несколько процессов вместо потоков.  Каждый процесс Python получает свой собственный интерпретатор Python и пространство в памяти, поэтому GIL не будет проблемой.  Python имеет многопроцессорный модуль, который позволяет нам легко создавать такие процессы:
boris@UbuntuLTS:~/GILSOLVE$ cat multi_threaded.py
# multi_threaded.py
import time
from threading import Thread
COUNT = 50000000
def countdown(n):
»»>while n>0:
»»»»>n -= 1
t1 = Thread(target=countdown, args=(COUNT//2,))
t2 = Thread(target=countdown, args=(COUNT//2,))
start = time.time()
t1.start()
t2.start()
t1.join()
t2.join()
end = time.time()
print('Time taken in seconds -', end - start)
boris@UbuntuLTS:~/GILSOLVE$ python3 multi_threaded.py
Time taken in seconds - 7.684694051742554
boris@UbuntuLTS:~/GILSOLVE$ cat multiprocess.py
from multiprocessing import Pool
import time
COUNT = 50000000
def countdown(n):
»»»>while n>0:
»»»»»>n -= 1
if name == 'main':
»»pool = Pool(processes=2)
»»start = time.time()
»»r1 = pool.apply_async(countdown, [COUNT//2])
»»r2 = pool.apply_async(countdown, [COUNT//2])
»»pool.close()
»»pool.join()
»»end = time.time()
»»print('Time taken in seconds -', end - start)
boris@UbuntuLTS:~/GILSOLVE$ python3 multiprocess.py
Time taken in seconds - 0.8765408992767334
Несколько процессов тяжелее, чем несколько потоков,это может стать узким местом при масштабировании.
На мощных многопроцессорных Intel Xeon Servers ( Haswell и выше ) это тестировалось.  На слабых CPU это не сработает.
Анонимный комментарий
9 февр 2023
Проблема как раз в том, что процесс "весит" ~10МБ БЕЗ данных :( Т.е. каждый такой "поток" весит всегда >10... Читать дальше
Представитель хостинг-провайдера Eternalhost...  · 3 февр 2023
Первый шаг к устранению GIL — понять, почему он существует.  Зачем обычно нужны блокировки в многопоточной программе? Для предотвращения так называемого состояния гонки данных (race condition), когда два потока одновременно... Читать далее
Просто о настройках и администрировании сайта в нашем блоге.Перейти на eternalhost.net/blog
Анонимный комментарий
9 февр 2023
запуск функции в 4 потоках с таким интервалом(10^-6 сек) к гонке данных не приводят :)
Разработчик на: C#, C++, Python  · 3 февр 2023
Могу посоветовать следующее: 1. Использование другой реализации Python, такой как Jython или IronPython, которые не имеют GIL. 2. Использование многопроцессорных библиотек, таких как multiprocessing, которые позволяют... Читать далее
Платная консультация, создание скриптов и программного обеспечения на заказ.Перейти на t.me/EN3RGY_TG
Анонимный комментарий
9 февр 2023
IronPython и Jython не пойдут… Jython - вообще python 2(древняя версия), а у IronPython проблемы с кроссплатформено... Читать дальше
Специалист в области управления и информатики в...  · 2 февр 2023
1. Использовать рабочие процессы многократно. 2. Разделить программу на две части: менеджер задач (сервер) и рабочие (которые выполняют задачи). По сути использовать распределенную архитектуру. В итоге: 1) Вы получите... Читать далее
Инженер путей сообщения – строитель  · 1 февр 2023
Не надо ничего обходить. Просто надо оптимизировать работу потоков. А оптимизируется она за счёт снижения количества синхронизированного кода. Это достигается за счёт того, что сначала создаются независимые массивы данных... Читать далее
А в си, что, нет динамической памяти(есть ведь функции для работы с памятью из "кучи": malloc, calloc, realloc... Читать дальше