Уведомления

Группа в Telegram: @pythonsu

#1 Июль 25, 2010 14:07:06

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

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

Стал разбиратся с нитями
набросал небольшой код на подобии того что нашел на форуме

# 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.



Отредактировано (Июль 25, 2010 14:08:34)

Офлайн

#2 Июль 25, 2010 15:01:43

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

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

Все что я могу предложить это прочитать еще очень много литературы про нити. Даже не стал вникать в подробности. Никакой синхронизации, сплошной хаос. Если интересует концептуальные вопросы, спрашивайте, а с этим примером рекомендую ctrl+a, del.



Офлайн

#3 Июль 25, 2010 16:50:49

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

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

>консоль просто закрывается
нужнго запускать так что-б было видно трейбек багов, возможно из за того что написано “breake” вместо “break”
>stopA = stopB =
ссылаются на один список

Офлайн

#4 Июль 25, 2010 17:05:00

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

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

Вы для начала опишите что хотите сделать-то. А то из кода это не ясно. Очень странный и запутанный код. Один while stopB чего стоит, при условии что stopB это список с 1-м элементом. Такое условие всегда будет истиной:

In [10]: bool([0])
Out[10]: True
Кроме того считается хорошим тоном писать какая именно Ос, версия питона и тд. Хотя я догадываюсь что у вас винда…



Офлайн

#5 Июль 25, 2010 17:18:32

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

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

спасибо большое
но вот ещё вопрос
изменил для Линук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)

Офлайн

#6 Июль 25, 2010 17:41:51

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

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

Вобщето основной код честно позаимствован от сюда
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



Отредактировано (Июль 25, 2010 17:44:52)

Офлайн

#7 Июль 25, 2010 17:54:28

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2832
Репутация: +  186  -
Профиль   Отправить e-mail  

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

> И stop = меня тоже активно вводит в заблуждение но к сожалению код типо …. не работает

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

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

thread.start_new_thread(myfunction,(stop))



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Отредактировано (Июль 25, 2010 17:58:00)

Офлайн

#8 Июль 25, 2010 17:57:40

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

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

так она требует

>>> 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



Офлайн

#9 Июль 25, 2010 18:14:09

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2832
Репутация: +  186  -
Профиль   Отправить e-mail  

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

А… точно, методу 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)

Офлайн

#10 Июль 25, 2010 18:37:29

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

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

Вот решение вашей задачи. Т к я недавно разбирался в том как это работает, то у меня был похожий пример - я его только малость переделал. Работает под 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
Именно в ней приведено решение, а также куча материала, который надо изучать.



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version