Форум сайта python.su
Стал разбиратся с нитями
набросал небольшой код на подобии того что нашел на форуме
# coding: utf8
import thread, time
from msvcrt import getch
def printA(stopA):
while stopA:
print 'A ',
time.sleep(0.3)
if stopA[0] :
break
def printB(stopB):
while stopB:
print 'B ',
time.sleep(0.3)
if stopB[0] :
break
stopA = stopB = [0]
n = 0
thread.start_new(printA,(stopA,))
thread.start_new(printB,(stopB,))
print "stopA=" + str(stopA)
print "stopB=" + str(stopB)
while 1:
n = getch()
print n
if n == "1":
stopA[0]=1
break
elif n == "2":
stopB[0]=1
breake
print "stopA=" + str(stopA)
print "stopB=" + str(stopB)
raw_input('exit')
Отредактировано (Июль 25, 2010 14:08:34)
Офлайн
Все что я могу предложить это прочитать еще очень много литературы про нити. Даже не стал вникать в подробности. Никакой синхронизации, сплошной хаос. Если интересует концептуальные вопросы, спрашивайте, а с этим примером рекомендую ctrl+a, del.
Офлайн
>консоль просто закрывается
нужнго запускать так что-б было видно трейбек багов, возможно из за того что написано “breake” вместо “break”
>stopA = stopB =
ссылаются на один список
Офлайн
Вы для начала опишите что хотите сделать-то. А то из кода это не ясно. Очень странный и запутанный код. Один while stopB чего стоит, при условии что stopB это список с 1-м элементом. Такое условие всегда будет истиной:
In [10]: bool([0])
Out[10]: True
Офлайн
спасибо большое
но вот ещё вопрос
изменил для Линукc geth на tty.setcbreak(sys.stdin)
n = sys.stdin.read(1)
теперь в консоли не печатаются они постоянно а отображается напечатаные при нажатии клавиши,
почему? это изза tty.setcbreak(sys.stdin) n = sys.stdin.read(1) ? он както резервирует экран треды в это время не отображаются?
Отредактировано (Июль 25, 2010 17:35:07)
Офлайн
Вобщето основной код честно позаимствован от сюда
http://python.su/forum/viewtopic.php?id=5346
import thread, time
# coding: utf8
import thread, time
def myfunction(stop):
while 1:
print '.',
if stop[0]: break
time.sleep(0.3)
stop = [0]
thread.start_new_thread(myfunction,(stop,))
raw_input('')
stop[0]=1
raw_input('exit')
# coding: utf8
import thread, time
def myfunction(stop):
while 1:
print '.',
if stop=1: break
time.sleep(0.3)
stop = 0
thread.start_new_thread(myfunction,(stop,))
raw_input('')
stop=1
raw_input('exit')
Отредактировано (Июль 25, 2010 17:44:52)
Офлайн
> И stop = меня тоже активно вводит в заблуждение но к сожалению код типо …. не работает
> thread.start_new_thread(myfunction,(stop,))
Ты зачем в функцию кортеж передаёшь? Тек надо:
thread.start_new_thread(myfunction,(stop))
Отредактировано (Июль 25, 2010 17:58:00)
Офлайн
так она требует
>>> thread.start_new_thread(myfunction,(stop))
Traceback (most recent call last):
File "<pyshell#8>", line 1, in <module>
thread.start_new_thread(myfunction,(stop))
TypeError: 2nd arg must be a tuple
Офлайн
А… точно, методу start_new_thread нужно указывать в качестве параметров кортеж. Тогда как то так оно должно без stop = работать:
#!/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'
Отредактировано (Июль 25, 2010 18:17:55)
Офлайн
Вот решение вашей задачи. Т к я недавно разбирался в том как это работает, то у меня был похожий пример - я его только малость переделал. Работает под Linux.
#!/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@kubu-book:~/development/PYTHON_projects$ python ./threadtest2.py & sleep 5; kill -10 %1; sleep 5; kill -12 %1
[1] 3680
<Trtest(Thread-1, started -1220207760)> A
<Trtest(Thread-2, started -1228600464)> B
<Trtest(Thread-1, started -1220207760)> A
<Trtest(Thread-2, started -1228600464)> B
<Trtest(Thread-1, started -1220207760)> A
<Trtest(Thread-2, started -1228600464)> B
<Trtest(Thread-1, started -1220207760)> A
<Trtest(Thread-2, started -1228600464)> B
<Trtest(Thread-1, started -1220207760)> A
<Trtest(Thread-2, started -1228600464)> B
stopping <Trtest(Thread-1, started -1220207760)>
<Trtest(Thread-2, started -1228600464)> B
<Trtest(Thread-2, started -1228600464)> B
<Trtest(Thread-2, started -1228600464)> B
<Trtest(Thread-2, started -1228600464)> B
<Trtest(Thread-2, started -1228600464)> B
stopping <Trtest(Thread-2, started -1228600464)>
alex@kubu-book:~/development/PYTHON_projects$
Офлайн