Уведомления

Группа в Telegram: @pythonsu

#1 Июль 25, 2010 19:42:17

nerijus
От:
Зарегистрирован: 2010-06-03
Сообщения: 93
Репутация: +  1  -
Профиль   Отправить e-mail  

помогите с нитями

    def join(self, timeout=1.0):
while self.isAlive():
super(Trtest, self).join(timeout)
Я помню этот код из другой темы, но лично я смотреть на это не могу. У меня волосы дыбом встают видя такое. Какой смысл завертывать join с timeout во внутрь join'a без timeout? Не луче ли “explicitly” вызвать? И главное такой подход делает код очень плохо читаемым. Ведь никому даже в голову не придет смотря на t1.join() что он в цикле с timeout крутится. Не надо чинить того что не испорчено.



Отредактировано (Июль 25, 2010 19:43:36)

Офлайн

#2 Июль 25, 2010 21:18:09

Alex2ndr
От:
Зарегистрирован: 2009-12-26
Сообщения: 204
Репутация: +  0  -
Профиль   Отправить e-mail  

помогите с нитями

nerijus
Какой смысл завертывать join с timeout во внутрь join'a без timeout?
А очень простой. Нужно вызывать join с бесконечным таймайутом, чтобы управление хоть иногда возвращалось к главному потоку. А как вы собираетесь явно вызвать бесконечный таймаут? Мы вот таким опосредованым способом получаем бесконечный таймайт - бесконечно вызывая по 1 сек.

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



Отредактировано (Июль 25, 2010 21:19:02)

Офлайн

#3 Июль 25, 2010 22:28:02

nerijus
От:
Зарегистрирован: 2010-06-03
Сообщения: 93
Репутация: +  1  -
Профиль   Отправить e-mail  

помогите с нитями

Alex2ndr
А как вы собираетесь явно вызвать бесконечный таймаут?
Также, только вынести этот цикл из класса.

while t1.isAlive():
t1.join(1)
Alex2ndr
Мы вроде в той же теме решили что это скорее вопрос вкуса как вызывать.
Можно и так сказать. Работа от этого цикл во внутри или снаружи не изменится. Но ваш подход очень обманчив для других, которые возможно этим будут пользоваться. В тaком случае, если хотите цикл завернуть во внутрь класса, хотя бы название метода поменяйте на какой нибудь looping_wait а не переопределяйте ни в чем не виноватый join. Если пишите только для себя тогда ок, невижу проблем. Но в каком нибудь публичном проекте, так делать я бы не рекомендовал.



Отредактировано (Июль 25, 2010 22:42:09)

Офлайн

#4 Июль 27, 2010 00:51:15

Alex_Kutsan
От:
Зарегистрирован: 2010-03-25
Сообщения: 150
Репутация: +  0  -
Профиль   Отправить e-mail  

помогите с нитями

этот код не работает:(

#!/usr/bin/python
# -*- coding: utf-8 -*-

import thread, time
def myfunction(stop):
while True:
print '.'
if stop: break
time.sleep(0.3)
stop = False
thread.start_new_thread(myfunction,(stop,))
raw_input('')
stop = True
print 'exit'
точнее ему пофиг а моё нажатие Энтер и если после “print ‘exit’” ему вставить ещё один инпут() то он продолжит перечислять точки.

А этот код тоже не работает :(
#!/usr/bin/env python
# vim: sw=4 ts=4 expandtab ai

import time
import threading
import signal

class Trtest(threading.Thread):

def __init__(self,letter,flagstop):
self.letter = letter
self.flagstop = flagstop
super(Trtest, self).__init__()

def run(self):
while not self.flagstop.isSet():
print str(self), self.letter
time.sleep(1.0)

def join(self, timeout=1.0):
while self.isAlive():
super(Trtest, self).join(timeout)

def stop(self):
print "stopping", str(self)
self.flagstop.set()

fl1 = threading.Event()
fl2 = threading.Event()
t1 = Trtest('A',fl1)
t2 = Trtest('B',fl2)
signal.signal(signal.SIGUSR1, lambda *a: t1.stop())
signal.signal(signal.SIGUSR2, lambda *a: t2.stop())
t1.start()
t2.start()
t1.join()
t2.join()
Ждал ждал я его сигналов , так и не дождался
alex@alex-laptop ~ $ '/media/Files/Alex Doc/Programs/pro/pytHON/Учебные и мусорные коды/thread2.py' 
<Trtest(Thread-1, started -1217262736)> A
<Trtest(Thread-2, started -1225655440)> B
<Trtest(Thread-1, started -1217262736)> A
<Trtest(Thread-2, started -1225655440)> B
<Trtest(Thread-1, started -1217262736)> A
<Trtest(Thread-2, started -1225655440)> B
<Trtest(Thread-1, started -1217262736)> A
<Trtest(Thread-2, started -1225655440)> B
<Trtest(Thread-1, started -1217262736)> A
<Trtest(Thread-2, started -1225655440)> B
<Trtest(Thread-1, started -1217262736)> A
<Trtest(Thread-2, started -1225655440)> B
<Trtest(Thread-1, started -1217262736)> A
<Trtest(Thread-2, started -1225655440)> B
<Trtest(Thread-1, started -1217262736)> A
<Trtest(Thread-2, started -1225655440)> B
<Trtest(Thread-1, started -1217262736)> A
<Trtest(Thread-2, started -1225655440)> B
<Trtest(Thread-1, started -1217262736)> A
<Trtest(Thread-2, started -1225655440)> B
<Trtest(Thread-1, started -1217262736)> A
<Trtest(Thread-2, started -1225655440)> B
<Trtest(Thread-1, started -1217262736)> A
<Trtest(Thread-2, started -1225655440)> B
<Trtest(Thread-1, started -1217262736)> A
<Trtest(Thread-2, started -1225655440)> B
<Trtest(Thread-1, started -1217262736)> A
<Trtest(Thread-2, started -1225655440)> B
<Trtest(Thread-1, started -1217262736)> A
<Trtest(Thread-2, started -1225655440)> B
<Trtest(Thread-1, started -1217262736)> A
<Trtest(Thread-2, started -1225655440)> B
<Trtest(Thread-1, started -1217262736)> A
<Trtest(Thread-2, started -1225655440)> B
<Trtest(Thread-1, started -1217262736)> A
<Trtest(Thread-2, started -1225655440)> B
^CTraceback (most recent call last):
File "/media/Files/Alex Doc/Programs/pro/pytHON/Учебные и мусорные коды/thread2.py", line 36, in <module>
t1.join()
File "/media/Files/Alex Doc/Programs/pro/pytHON/Учебные и мусорные коды/thread2.py", line 22, in join
super(Trtest, self).join(timeout)
File "/usr/lib/python2.6/threading.py", line 655, in join
self.__block.wait(delay)
File "/usr/lib/python2.6/threading.py", line 258, in wait
_sleep(delay)
KeyboardInterrupt
<Trtest(Thread-1, started -1217262736)> A
<Trtest(Thread-2, started -1225655440)> B
^CException KeyboardInterrupt in <module 'threading' from '/usr/lib/python2.6/threading.pyc'> ignored
alex@alex-laptop ~ $ ^C



Офлайн

#5 Июль 27, 2010 08:45:56

Alex2ndr
От:
Зарегистрирован: 2009-12-26
Сообщения: 204
Репутация: +  0  -
Профиль   Отправить e-mail  

помогите с нитями

Alex_Kutsan
Ждал ждал я его сигналов , так и не дождался
Что значит ждали? Их надо было не ждать, а послать. Обратите внимание на первую строку в моем выводе:
alex@kubu-book:~/development/PYTHON_projects$ python ./threadtest2.py & sleep 5; kill -10 %1; sleep 5; kill -12 %1
Я использовал небольшой однострочник, для того, чтобы послать сигналы автоматически. Кстати наверно удобнее будет вместо %1 писать %+
название_скрипта.py & sleep 5; kill -10 %+; sleep 5; kill -12 %+
Порядок посыла сигналов определяет завершение потоков.

Впрочем можете просто определить pid нужного скрипта и посылать ему сигналы с другой консоли. Это еще проще.



Офлайн

#6 Июль 27, 2010 10:32:23

Alex_Kutsan
От:
Зарегистрирован: 2010-03-25
Сообщения: 150
Репутация: +  0  -
Профиль   Отправить e-mail  

помогите с нитями

Извиняюсь в первый раз встретился с “однострочными скриптами ” прямо в консоли.
Это bash скрипт? или куда копать чтоб про это подробнее узнать?
например что такое %1, или как вы говорите удобнее %+,
sleep 5 как я понял это послать сигнал чрез 5 секунд , но тогда что такое kill - 10, и kill -12



Офлайн

#7 Июль 27, 2010 11:48:27

Alex2ndr
От:
Зарегистрирован: 2009-12-26
Сообщения: 204
Репутация: +  0  -
Профиль   Отправить e-mail  

помогите с нитями

Alex_Kutsan
Это bash скрипт?
Да.

Alex_Kutsan
например что такое %1, или как вы говорите удобнее %+,
У каждой из запущенных копий bash есть свой список процессов, находящихся в на заднем фоне(background). Если я после команды пишу & то она отправляется на дальнейшее выполнение в фон. Посмотреть их можно командой jobs. При добавлении команда покажет номер по порядку среди фоновых задач и номер pid.

Alex_Kutsan
но тогда что такое kill - 10, и kill -12
Kill это команда для отправки сигнала некому процессу. Формат использования - kill pid .По умолчанию отправляет SIGTERM (т е номер 15). Но можно ручками указать какие сигналы слать. Вот я и указал - kill -10 это послать SIGUSR1 а kill -12 это SIGUSR2.

Теперь о %1 и %+ . Это способ обратится к фоновым задачам. 1 это к первой, а + к последней добавленной.

Пример:
alex@debian-gate:~$ sleep 1000 &
[1] 15085
alex@debian-gate:~$ jobs
[1]+ Running sleep 1000 &
alex@debian-gate:~$ ps awux | grep sleep
alex 15085 0.0 0.0 3016 508 pts/2 S 12:43 0:00 sleep 1000
alex 15087 0.0 0.0 3144 772 pts/2 R+ 12:43 0:00 grep sleep
alex@debian-gate:~$ kill %1
[1]+ Завершено sleep 1000
alex@debian-gate:~$ jobs
alex@debian-gate:~$
alex@debian-gate:~$ sleep 1000 &
[1] 15088
alex@debian-gate:~$
alex@debian-gate:~$ kill %+
[1]+ Завершено sleep 1000
alex@debian-gate:~$
alex@debian-gate:~$ sleep 1000 &
[1] 15090
alex@debian-gate:~$
alex@debian-gate:~$ kill 15090
[1]+ Завершено sleep 1000
alex@debian-gate:~$
Вообщем то ничего особенного тут нет. Основы работы с процессами в unix… Вот есть такая статейка - http://www.ibm.com/developerworks/ru/library/au-speakingunix8/



Офлайн

#8 Июль 28, 2010 01:37:35

Alex_Kutsan
От:
Зарегистрирован: 2010-03-25
Сообщения: 150
Репутация: +  0  -
Профиль   Отправить e-mail  

помогите с нитями

Спасибо огромное, я какраз начал после этого изучать bash скрипты, но ваша сслылка и информация намногопознавательней



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version