Найти - Пользователи
Полная версия: помогите с нитями
Начало » Python для новичков » помогите с нитями
1 2
Alex_Kutsan
Стал разбиратся с нитями
набросал небольшой код на подобии того что нашел на форуме
# 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')
И вот несколько вопросов:
1 - почему код не работает ка надо?
по нажатию “2” консоль просто закрывается
по нажатию “1” прекращяются оба треда как printA так и printB в чём дело? почему по нажатию “1” изменяются обе переменные как stopA] так и stopB

2 - почему тред прекращяется после stopA=1?
ведь в условии сказано if stopA : это как я понимаю означает " если существует stopA" но она и до этого существует, только она
= 0.
nerijus
Все что я могу предложить это прочитать еще очень много литературы про нити. Даже не стал вникать в подробности. Никакой синхронизации, сплошной хаос. Если интересует концептуальные вопросы, спрашивайте, а с этим примером рекомендую ctrl+a, del.
o7412369815963
>консоль просто закрывается
нужнго запускать так что-б было видно трейбек багов, возможно из за того что написано “breake” вместо “break”
>stopA = stopB =
ссылаются на один список
Alex2ndr
Вы для начала опишите что хотите сделать-то. А то из кода это не ясно. Очень странный и запутанный код. Один while stopB чего стоит, при условии что stopB это список с 1-м элементом. Такое условие всегда будет истиной:
In [10]: bool([0])
Out[10]: True
Кроме того считается хорошим тоном писать какая именно Ос, версия питона и тд. Хотя я догадываюсь что у вас винда…
Alex_Kutsan
спасибо большое
но вот ещё вопрос
изменил для Линукc geth на tty.setcbreak(sys.stdin)
n = sys.stdin.read(1)
теперь в консоли не печатаются они постоянно а отображается напечатаные при нажатии клавиши,
почему? это изза tty.setcbreak(sys.stdin) n = sys.stdin.read(1) ? он както резервирует экран треды в это время не отображаются?
Alex_Kutsan
Вобщето основной код честно позаимствован от сюда
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')
И stop = меня тоже активно вводит в заблуждение но к сожалению код типо
# 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')
не работает
он не обращяя внимания на нажатие Энтер продолжает себе перечислять точки.
А я хотел селать простенькую прогу которая будет одновременно перечислять буквы А и B, и по нажатию клавиши “a” прекратит перечислять А, а понажатию клавиши “b” прекратит перечислять В.
___________
Теперь Линукс + Питон 2,6
Rodegast
> И stop = меня тоже активно вводит в заблуждение но к сожалению код типо …. не работает

> thread.start_new_thread(myfunction,(stop,))

Ты зачем в функцию кортеж передаёшь? Тек надо:

thread.start_new_thread(myfunction,(stop))
Alex_Kutsan
так она требует
>>> 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
Rodegast
А… точно, методу 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'
Alex2ndr
Вот решение вашей задачи. Т к я недавно разбирался в том как это работает, то у меня был похожий пример - я его только малость переделал. Работает под 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$
Он запускается, через 5 секунд получает сигнал прибить поток 1, а еще через 5 и поток 2, после скрипт завершается.
Советую почитать вот эту тему - http://www.python.su/forum/viewtopic.php?id=7817
Именно в ней приведено решение, а также куча материала, который надо изучать.
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