У меня разные темы, и после обработки они помещают данные в общий список. Есть ли что-нибудь построенное в python для списка или массив numpy, к которому можно получить доступ только по одному потоку. Во-вторых, если это не тот элегантный способ сделать это?Как синхронизировать списки python?
ответ
Как насчет стандартной библиотеки Queue?
Согласно Thread synchronisation mechanisms in Python, чтение одного элемента из списка и изменение списка на месте гарантированно будут атомарными. Если это так (хотя, кажется, частично противоречит самому существованию модуля очереди), а затем, если ваш код все формы:
try:
val = mylist.pop()
except IndexError:
# wait for a while or exit
else:
# process val
И все положить в mylist
делается .append()
, то ваш код уже потокобезопасен. Если вы не доверяете этому документу на этот счет, используйте queue.queue, который выполняет всю синхронизацию для вас, и имеет лучший API, чем list
для параллельных программ - в частности, он дает вам возможность блокировки неограниченно или для таймаута , ожидая, что .pop()
будет работать, если у вас нет чего-то другого, с которым поток может быть продолжен в среднем.
Для Numpy массивов, а в общем любом случае, если вам нужно больше, чем очереди производитель/потребитель, использовать Lock
или RLock
из threading
- это реализовать протокол контекста менеджера, поэтому их использование довольно прост:
with mylock:
# Process as necessarry
И python гарантирует, что блокировка будет выпущена после того, как вы упадете с конца блока with
- в том числе в сложных случаях, например, если что-то делает рейз исключение.
Наконец, рассмотрим, подходит ли multiprocessing
для вашего приложения, чем threading
- потоки в Python не гарантируются на самом деле одновременно, а в CPython только при переходе на C-уровневый код. multiprocessing
обошел эту проблему, но может иметь некоторые дополнительные накладные расходы - если вы еще этого не сделали, вы должны прочитать документы, чтобы определить, какой из них лучше подходит вашим потребностям.
- 1. Как синхронизировать потоки python?
- 2. Синхронизировать списки контактов с центральным сервером
- 3. Как работают списки Python?
- 4. Как синхронизировать потоки с Python?
- 5. Как синхронизировать вывод подпроцесса Python
- 6. Как синхронизировать MySQL с python?
- 7. Python списки
- 8. Как синхронизировать отсортированные списки jquery, содержащие клонированные элементы?
- 9. Как Python хранит списки внутри?
- 10. Как сравнить списки в Python
- 11. Как разбить списки в Python
- 12. Как нарезать списки в Python
- 13. Как разбить списки на python?
- 14. Как сделать списки создания python
- 15. Как создать иерархические списки python
- 16. Как заменить элементы Python списки
- 17. Как сохранить списки в python
- 18. Как конвертировать списки в Python?
- 19. Списки, строки и плавающие списки Python
- 20. раскалывается Списки Списки по длине в Python
- 21. списки python в списке
- 22. Базовые списки Python
- 23. Python свапирования списки
- 24. Довольно печать Списки Python
- 25. Python списки для начинающих
- 26. 2D списки поколения Python
- 27. Классы и списки Python
- 28. списки Python и операторы
- 29. Python Поиск Вложенные списки
- 30. Python: добавление в списки
является 'mylist.pop (0)' также атмоическим? – willsteel
Спасибо за 'с mylock:' напоминанием. Imho RLocks, используемые таким образом, часто являются наиболее четкой идиомой для защиты критических разделов в объектно-ориентированном программировании. – jjmontes
@willsteel для окончательного ответа, я бы рекомендовал посмотреть исходный код Python на то, как реализованы списки, но я бы * представил *, что 'mylist.pop (0)' будет атомарным, если 'mylist.pop()' is (что я также не могу ответить окончательно, поэтому я также упоминаю другие методы синхронизации, а также может меняться в реализации Python). В частности, весь код C-уровня в CPython * может * быть защищен GIL (но имеет возможность его выпуска). 'pop' (возможно) либо выпускает GIL, либо нет, независимо от его аргумента. – lvc