2013-02-10 2 views
1

Спецификация задачи:Насколько быстро может быть заблокирован() или прокси-сервер, перечисляет проблему?

Я бег несколько сложных задач в питоне и ускорить его, я решил использовать питон MultiProcessing библиотеки. Это сработало очень хорошо, но через некоторое время я начал задаваться вопросом, сколько времени задерживают, я использую, потребляя и сколько процессов блокируют друг друга.

Структура процессов заключается в следующем:

Один процесс, который обновляет общий список между процессами. Код обновления данных что-то вроде этого:

lock.acquire() 
list_rex[0] = pat.some_list 
list_rex[1] = pat.some_dictionary 
lock.release() 

где list_rex и замок определяются

list_rex = manager.list([[some_elements], {some_elements}]) 
lock = multi.Lock() 

И тогда есть несколько процессов, которые время от времени обновляет свое собственное пространство памяти с этим списком .The код выглядит следующим образом:

lock.acquire() 
some_list = list_rex[0] 
some_dict = list_rex[1] 
lock.release() 

some_list и some_dict каким-то образом связаны, так что я не могу позволить процессам иметь информацию в some_list из различных обновлений, чем в some_dict ,

И мой вопрос:, насколько быстро методы приобретают() и освобождают()? В моем случае их можно вызвать в течение нескольких секунд, а иногда и миллисекунд. И/или есть ли способ избежать использования замков в моем случае?

Спасибо за ваше время.

EDIT: после рассмотрения вашего комментария, мой вопрос, вероятно, должен быть - как списки прокси влияют на мои расчеты? Я использую «some_list» и «some_dict» действительно много, чтобы читать после обновления.

+0

У меня нет надежных ссылок, но я предполагаю, что использование списка прокси-сервера может замедлить вас гораздо больше, чем блокировки. См. [Этот вопрос] (http://stackoverflow.com/q/13121790/1258041) на примере. –

+0

Хмм я об этом не думал. Я думал, что замки - это узкое место. Я сделаю еще несколько исследований. – Jendas

+0

Вы можете использовать модуль [timeit] (http://docs.python.org/2/library/timeit.html) для измерения времени выполнения кода. – Igonato

ответ

1

Я собирался написать очень сложный ответ, включающий блокировки считывателя-записи, присвоения атомных ссылок, не требующие блокировок, если вы просто использовали один объект как для списка, так и для словаря вместе, а также некоторые другие вещи, касающиеся измерения производительности, прежде чем что-либо менять. ..

Но потом я потратил немного времени, чтобы посмотреть, что вы на самом деле делаете в своих замках ... по существу, не более чем пара заданий ссылки. Ни один из них не блокирует, или делает I/O, или что-либо «медленное». Это всего лишь несколько переменных заданий. Таким образом, короткий ответ заключается в том, что вы приобретаете/выпускаете блокировки, вероятно, незначительны. Если вы не входите в замки через десятки потоков сотни раз в секунду, это воздействие незначительно. Но не верьте мне на слово - пойдите, измерьте это.

Я больше беспокоюсь о том, что происходит, когда some_list и some_dict ссылаются на другие процессы за пределами блокировки, в то время как list_rex обновляется внутри блокировки.

+0

Вы правы! Время действительно невелико.Раньше я этого не делал, потому что думал, что это проблема. Поэтому мне, вероятно, придется рассмотреть комментарий, упомянутый выше. И к вашему беспокойству - почему это должно вызвать какие-либо проблемы? Я знаю, что списки изменяемы, но я подумал, что если если copy-some_dict = list_rex [1] - из списка прокси-сервера, он создаст чистую копию внутри, а не только ссылку на ссылку. – Jendas

+1

Переменные назначения типов объектов в Python не являются глубокими копиями! Это ссылочные присвоения ** тому же ** списку. – selbie

Смежные вопросы