mironich
Ноя. 6, 2012 03:23:22
Как в python заблокировать все потоки кроме токо который вызвал блокировку, и основного, средствами python(модуль threading).
adray
Ноя. 6, 2012 09:53:04
семафорами
mironich
Ноя. 7, 2012 07:14:12
adray
семафор
Можно пример?
Как понял семафор отличаеться от обычной блокировки только наличием счетчика макс. допустимого кол-ва потоков для доступа к рес-су?
Soteric
Ноя. 7, 2012 08:31:43
Можно пример где возникает описанная необходимость?
mironich
Ноя. 7, 2012 08:42:10
Soteric
Можно пример где возникает описанная необходимость?
Soteric
Можно пример где возникает описанная необходимость?
Пример: есть GUI приложение оно в определенный момент может потребовать длительную работу с общими рес-сами, допустим 1 мин.
Вот входит в блокировку, и на это время стопоряться все потоки вкл. главный, интерфейс соотвественно виснет.
Soteric
Ноя. 7, 2012 09:19:41
Все длительные операции, включая операции которые потенциально могут быть заблокированы, выносятся в отдельный поток. В этом случае гуи не виснет, а задача, выделенная в этот отдельный поток, ждет когда освободятся ресурсы. Не уловил зачем здесь что-то блокировать?
4kpt
Ноя. 7, 2012 09:37:16
Да не парься. Выведи просто сообщение или процент выполнения. Привяжи к процессу и периодически делай update_idletasks(), чтобы процент обновлялся.
P.S. Если ты говоришь, что доступ к одному ресурсу, то что ты хочешь дать пользователю делать???
Любое изменение приведет к похерению целостности данных - посему пусть смотрит на проценты и ждет…
adray
Ноя. 7, 2012 13:30:11
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 - нет
mironich
Ноя. 7, 2012 14:48:04
Всем спасибо, а нет ли где русской док-ции по модулю threading?
А то много вопросов возникакет, а с инглишом у меня все совсем плохо.
odnochlen
Ноя. 7, 2012 15:13:40
adray
t = threading.Thread(target = lambda: f(name))
У меня идею взял?