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

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

while t1.isAlive():
t1.join(1)
Alex2ndr
Мы вроде в той же теме решили что это скорее вопрос вкуса как вызывать.
Можно и так сказать. Работа от этого цикл во внутри или снаружи не изменится. Но ваш подход очень обманчив для других, которые возможно этим будут пользоваться. В тaком случае, если хотите цикл завернуть во внутрь класса, хотя бы название метода поменяйте на какой нибудь looping_wait а не переопределяйте ни в чем не виноватый join. Если пишите только для себя тогда ок, невижу проблем. Но в каком нибудь публичном проекте, так делать я бы не рекомендовал.
Alex_Kutsan
этот код не работает:(
#!/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
Alex2ndr
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 нужного скрипта и посылать ему сигналы с другой консоли. Это еще проще.
Alex_Kutsan
Извиняюсь в первый раз встретился с “однострочными скриптами ” прямо в консоли.
Это bash скрипт? или куда копать чтоб про это подробнее узнать?
например что такое %1, или как вы говорите удобнее %+,
sleep 5 как я понял это послать сигнал чрез 5 секунд , но тогда что такое kill - 10, и kill -12
Alex2ndr
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/
Alex_Kutsan
Спасибо огромное, я какраз начал после этого изучать bash скрипты, но ваша сслылка и информация намногопознавательней
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB