Форум сайта python.su
def join(self, timeout=1.0):
while self.isAlive():
super(Trtest, self).join(timeout)
Отредактировано (Июль 25, 2010 19:43:36)
Офлайн
nerijusА очень простой. Нужно вызывать join с бесконечным таймайутом, чтобы управление хоть иногда возвращалось к главному потоку. А как вы собираетесь явно вызвать бесконечный таймаут? Мы вот таким опосредованым способом получаем бесконечный таймайт - бесконечно вызывая по 1 сек.
Какой смысл завертывать join с timeout во внутрь join'a без timeout?
Отредактировано (Июль 25, 2010 21:19:02)
Офлайн
Alex2ndrТакже, только вынести этот цикл из класса.
А как вы собираетесь явно вызвать бесконечный таймаут?
while t1.isAlive():
t1.join(1)
Alex2ndrМожно и так сказать. Работа от этого цикл во внутри или снаружи не изменится. Но ваш подход очень обманчив для других, которые возможно этим будут пользоваться. В тaком случае, если хотите цикл завернуть во внутрь класса, хотя бы название метода поменяйте на какой нибудь looping_wait а не переопределяйте ни в чем не виноватый join. Если пишите только для себя тогда ок, невижу проблем. Но в каком нибудь публичном проекте, так делать я бы не рекомендовал.
Мы вроде в той же теме решили что это скорее вопрос вкуса как вызывать.
Отредактировано (Июль 25, 2010 22:42:09)
Офлайн
этот код не работает:(
#!/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'
#!/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
Офлайн
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 %+Порядок посыла сигналов определяет завершение потоков.
Офлайн
Извиняюсь в первый раз встретился с “однострочными скриптами ” прямо в консоли.
Это bash скрипт? или куда копать чтоб про это подробнее узнать?
например что такое %1, или как вы говорите удобнее %+,
sleep 5 как я понял это послать сигнал чрез 5 секунд , но тогда что такое kill - 10, и kill -12
Офлайн
Alex_KutsanДа.
Это bash скрипт?
Alex_KutsanУ каждой из запущенных копий bash есть свой список процессов, находящихся в на заднем фоне(background). Если я после команды пишу & то она отправляется на дальнейшее выполнение в фон. Посмотреть их можно командой jobs. При добавлении команда покажет номер по порядку среди фоновых задач и номер pid.
например что такое %1, или как вы говорите удобнее %+,
Alex_KutsanKill это команда для отправки сигнала некому процессу. Формат использования - kill pid .По умолчанию отправляет SIGTERM (т е номер 15). Но можно ручками указать какие сигналы слать. Вот я и указал - kill -10 это послать SIGUSR1 а kill -12 это SIGUSR2.
но тогда что такое kill - 10, и kill -12
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:~$
Офлайн
Спасибо огромное, я какраз начал после этого изучать bash скрипты, но ваша сслылка и информация намногопознавательней
Офлайн