Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 22, 2013 18:18:36

Soteric
От:
Зарегистрирован: 2010-09-19
Сообщения: 352
Репутация: +  20  -
Профиль   Отправить e-mail  

multiprocessing + pygtk + urllib2 opener

Локальные переменные живут только в пределах выполнения метода. Значит при каждом вызове будет создаваться новый лок. Значит для каждого потока он будет своим.



Офлайн

#2 Июнь 22, 2013 19:01:51

Shaman
Зарегистрирован: 2013-03-15
Сообщения: 1369
Репутация: +  88  -
Профиль   Отправить e-mail  

multiprocessing + pygtk + urllib2 opener

Спасибо! Протестировал, разобрался.

Офлайн

#3 Июнь 23, 2013 02:03:32

nowayout
Зарегистрирован: 2013-06-21
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

multiprocessing + pygtk + urllib2 opener

А если есть какой-нибудь массив, словарь, что-то еще, что мне нужно только читать. Не удалять элементы, заменять там что-то, а только обращаться по индексу/ключу, то нужно эти массивы/словари как-то специально расшаривать для всех процессов или это надо делать только для того, куда каким-то образом идет запись: stdout/файл/etc ?

Отредактировано nowayout (Июнь 23, 2013 02:04:44)

Офлайн

#4 Июнь 23, 2013 07:30:51

lorien
От:
Зарегистрирован: 2006-08-20
Сообщения: 755
Репутация: +  37  -
Профиль  

multiprocessing + pygtk + urllib2 opener

Хотелось бы еще узнать насчет записи в бд. Если я буду использовать mongodb, то как правильно с нескольких процессов писать в одну базу ? Для записи в обычный текстовый файл я сделал так:
Если вы будете сохранять разные объекты, то никаких локов не нужно. Если вы будете из разных процессов сохранять с помощью операции save (http://docs.mongodb.org/manual/reference/method/db.collection.save/) один и тот же объект, значит у вас неправильная логика приложения. Когда вам нужно работать из разных потоков с одним объектом, вам нужно использовать операцию update (http://docs.mongodb.org/manual/core/update/). Никаких локов не нужно. Под объектом выше я подразумеваю какой-то конкретный объект конкретной коллекции mongodb.

, то нужно эти массивы/словари как-то специально расшаривать для всех процессов
В питоне обычно употребляется термин список (list), а не массив. Ещё есть кортежи (tuple), опять же не массивы. Не очень понял, что вы спрашивали, но если у вас есть нечто доступное для чтения из разных процессов и вы это нечто специально не “расшаривали”, скорее всего и не нужно его “расшаривать”.

Офлайн

#5 Июнь 23, 2013 07:40:44

nowayout
Зарегистрирован: 2013-06-21
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

multiprocessing + pygtk + urllib2 opener

lorien
обычно употребляется термин список (list), а не массив. Ещё есть кортежи (tuple
Знаю-знаю. Ну, например есть у меня список asdasd = С элементами типа string. В каждом процессе (их, к примеру, 20 штук) у меня отправляются get-запросы на разные страницы и там (на странице) проверяется наличие элементов из списка asdasd. Вопрос: можно ли просто это сделать как
...
for x in asdasd:
    if x in res:
        pass
...
lorien
скорее всего и не нужно его “расшаривать”.
Ну вот я так же думаю, хотч не до конца в этом уверен.

lorien
нужно использовать операцию update
Я немного почитал доки и мне кажется, что мне нужен insert. Я хотел вот что узнать: мне для каждого процесса нужно делать
client = MongoClient()
db = client.database
или все это делать заранее и передавать потом это в качестве аргументов
p = Process(target=func, args=(db))
? Простите, если неясно выражаюсь

Офлайн

#6 Июнь 23, 2013 09:58:24

lorien
От:
Зарегистрирован: 2006-08-20
Сообщения: 755
Репутация: +  37  -
Профиль  

multiprocessing + pygtk + urllib2 opener

Если честно, мне не понятна природа ваших вопросов. Я уже давно программирую и привык решать вопросы по мере их возникновения. У вас есть какая-то проблема, напишите код для её решения. Потом покажите его, вам посоветуют что-нибудь исправить. Можно бесконечно задавать вопросы, ни написал ни строчки кода.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version