Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 6, 2012 03:23:22

mironich
От:
Зарегистрирован: 2011-05-23
Сообщения: 118
Репутация: +  2  -
Профиль   Отправить e-mail  

Блокировка не всех потоков

Как в python заблокировать все потоки кроме токо который вызвал блокировку, и основного, средствами python(модуль threading).



Офлайн

#2 Ноя. 6, 2012 09:53:04

adray
Зарегистрирован: 2012-09-15
Сообщения: 123
Репутация: +  18  -
Профиль   Отправить e-mail  

Блокировка не всех потоков

семафорами

Офлайн

#3 Ноя. 7, 2012 07:14:12

mironich
От:
Зарегистрирован: 2011-05-23
Сообщения: 118
Репутация: +  2  -
Профиль   Отправить e-mail  

Блокировка не всех потоков

adray
семафор
Можно пример?
Как понял семафор отличаеться от обычной блокировки только наличием счетчика макс. допустимого кол-ва потоков для доступа к рес-су?



Офлайн

#4 Ноя. 7, 2012 08:31:43

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

Блокировка не всех потоков

Можно пример где возникает описанная необходимость?



Офлайн

#5 Ноя. 7, 2012 08:42:10

mironich
От:
Зарегистрирован: 2011-05-23
Сообщения: 118
Репутация: +  2  -
Профиль   Отправить e-mail  

Блокировка не всех потоков

Soteric
Можно пример где возникает описанная необходимость?
Soteric
Можно пример где возникает описанная необходимость?
Пример: есть GUI приложение оно в определенный момент может потребовать длительную работу с общими рес-сами, допустим 1 мин.
Вот входит в блокировку, и на это время стопоряться все потоки вкл. главный, интерфейс соотвественно виснет.



Офлайн

#6 Ноя. 7, 2012 09:19:41

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

Блокировка не всех потоков

Все длительные операции, включая операции которые потенциально могут быть заблокированы, выносятся в отдельный поток. В этом случае гуи не виснет, а задача, выделенная в этот отдельный поток, ждет когда освободятся ресурсы. Не уловил зачем здесь что-то блокировать?



Офлайн

#7 Ноя. 7, 2012 09:37:16

4kpt
От: Харьков
Зарегистрирован: 2010-11-03
Сообщения: 998
Репутация: +  63  -
Профиль   Отправить e-mail  

Блокировка не всех потоков

Да не парься. Выведи просто сообщение или процент выполнения. Привяжи к процессу и периодически делай update_idletasks(), чтобы процент обновлялся.

P.S. Если ты говоришь, что доступ к одному ресурсу, то что ты хочешь дать пользователю делать???
Любое изменение приведет к похерению целостности данных - посему пусть смотрит на проценты и ждет…



Офлайн

#8 Ноя. 7, 2012 13:30:11

adray
Зарегистрирован: 2012-09-15
Сообщения: 123
Репутация: +  18  -
Профиль   Отправить e-mail  

Блокировка не всех потоков

def f(name):
    with sem:
        for i in range(10):
            print('from {0} with love'.format(name))
            time.sleep(1)
... 
def run(name):
    t = threading.Thread(target = lambda: f(name))
    t.daemon = True
    t.start()
... 
>>> sem = threading.Semaphore(2)
>>> run('hell'); run('russia'); run('thread0')

Как уже верно отметили @4kpt и @Soteric, такая блокировка скорее всего не нужна - она может понадобиться, если одновременное выполнение main и thread0 потокобезопасно, а thread0 и threadN - нет

Отредактировано adray (Ноя. 7, 2012 13:31:07)

Офлайн

#9 Ноя. 7, 2012 14:48:04

mironich
От:
Зарегистрирован: 2011-05-23
Сообщения: 118
Репутация: +  2  -
Профиль   Отправить e-mail  

Блокировка не всех потоков

Всем спасибо, а нет ли где русской док-ции по модулю threading?
А то много вопросов возникакет, а с инглишом у меня все совсем плохо.



Офлайн

#10 Ноя. 7, 2012 15:13:40

odnochlen
Зарегистрирован: 2012-06-28
Сообщения: 794
Репутация: +  14  -
Профиль   Отправить e-mail  

Блокировка не всех потоков

adray
t = threading.Thread(target = lambda: f(name))
У меня идею взял?

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version