Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 4, 2011 15:54:34

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

Problem with Threads

Пробема с потоками

Через раз, то программа ничго не выдаёт, то выдаёт ошибку вида


вот код

import thread
class MyClass:
def __init__(self,name):
self.name = name
self.output = "output"
self.input = "free"
def send_mess(self,resiver):
thread.start_new(resiver.get_mess,(self,self.output))
#print self.name , 'said I DID IT!'

def get_mess(self,sender,message):
self.input = message
print self.name ,'from',sender.name, self.input
if message!='back':
sender.get_mess(self,'back')



def main():
M1 = MyClass('Alex')
M2 = MyClass('Sasha')
#M2.get_mess('mama mia')
M2.send_mess(M1)
#print M1.name

#print M2.output
return 0


if __name__ == '__main__':
main()



Офлайн

#2 Авг. 4, 2011 16:18:07

Enchantner
От:
Зарегистрирован: 2009-02-11
Сообщения: 442
Репутация: +  0  -
Профиль   Отправить e-mail  

Problem with Threads

Alex_Kutsan
а зачем thread, когда есть threading?



Офлайн

#3 Авг. 4, 2011 16:55:27

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

Problem with Threads

Спасибо, решил так

	def send_mess(self,resiver):
T = threading.Thread(None,resiver.get_mess,None,(self,self.output))
T.start()
print '/n ',self.name , 'said I DID IT!'
кстати подскажите Это не сильно некрасивая реализация, мне что-то она не нравится. И ещё, теорию в этом смысле а не сильно знаю. Я создал экземпляр класса, функция завершилась, ссылку потерял. А сам объект, не удалился? разве это не утечка памяти? Если что, сильно не пинайте, про классы узнал только что из вики учебника, или в питоне как в Яве есть механизм сборки мусора?



Офлайн

#4 Авг. 4, 2011 17:14:23

Enchantner
От:
Зарегистрирован: 2009-02-11
Сообщения: 442
Репутация: +  0  -
Профиль   Отправить e-mail  

Problem with Threads

Alex_Kutsan
Во-первых, во многих случаях гораздо проще самому описать класс потока, унаследовав его от threading.Thread и переопределив в нем метод run(), который и будет играть роль потоковой функции. Это есть в доках, а еще это описано в блоге у Андрея Светлова: http://asvetlov.blogspot.com/2010/11/1.html
Во-вторых, вы пишете на питоне, а не на C. При создании объекта потока запускается неявный контроль, и (если не указан тот же setDaemon) скрипт для завершения ждет в главном потоке завершения всех дочерних. Вручную это можно сделать с помощью T.join().

И да, в питоне есть свой Garbage Collector, разумеется. Читайте теорию.



Отредактировано (Авг. 4, 2011 17:16:15)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version