Уведомления

Группа в Telegram: @pythonsu

#1 Июль 6, 2008 23:09:50

Hider
От:
Зарегистрирован: 2008-05-12
Сообщения: 16
Репутация: +  0  -
Профиль   Отправить e-mail  

thread

имеется такая проблема, нужно писать в сокет и принимать на нем, одновременно, почитал о thread'ах, посмотрел екземплы, непонял каие ему еще аргументы надо при start_new()
и сделал вроде так как в екземпле:

...
def reciver():
while True: # цикл для чтения из сокета
recv_data = sock.recv(1024)
print recv_data
for i in range(1):
thread.start_new(reciver, (i, 100))
while True: # цикл для писания в сокет
send_data = raw_input("> ")
sock.send(send_data)
...
но получаю ексепшн:
Unhandled exception in thread started by <function reciver at 0xb7cfd3e4>
TypeError: reciver() takes no arguments (2 given)

кто работал с thread'ами, помогите пожалуйста, обясните как запускать thread и продолжать исполнение кода, ато я сделал как в екземпле, а причем тут инструкция for непонимаю
(без него просто запускается целевой цикл (не в потоке) и крутится, а остальной код не исполняется)



Офлайн

#2 Июль 7, 2008 00:35:20

ZioN
От:
Зарегистрирован: 2007-07-12
Сообщения: 50
Репутация: +  0  -
Профиль   Отправить e-mail  

thread

из примеров:


import threading, socket

class Root_tr (threading.Thread):

def __init__(self, chanel, details):
self.chanel = chanel
self.details = details
threading.Thread.__init__(self)

def run(self):
print self.chanel.recv(4096)
self.chanel.close()




serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
serv.bind(('localhost', '88'))
serv.listen(5)

while True:
channel, details = serv.accept()
Root_tr(channel, details).start()



Отредактировано (Июль 7, 2008 00:36:22)

Офлайн

#3 Июль 7, 2008 06:04:52

hellslade
От:
Зарегистрирован: 2008-01-28
Сообщения: 240
Репутация: +  0  -
Профиль   Отправить e-mail  

thread

по уму for действительно не нужен, он выполняется один раз с i=0 для запуска потока.
ексепшн возникает т.к. вы передаете функции reciver параметры (i, 100), которых у нее не должно быть.
запускайте поток без параметров или включите их в функцию. thread.start_new(reciver, ())



Офлайн

#4 Июль 7, 2008 13:04:17

cybergrind
От:
Зарегистрирован: 2008-01-21
Сообщения: 201
Репутация: +  0  -
Профиль   Отправить e-mail  

thread

или пусть reciever принимает параметры =)



Офлайн

#5 Июль 8, 2008 23:48:47

Hider
От:
Зарегистрирован: 2008-05-12
Сообщения: 16
Репутация: +  0  -
Профиль   Отправить e-mail  

thread

ZioN
из примеров:

Код::

import threading, socket

class Root_tr (threading.Thread):

def __init__(self, chanel, details):
self.chanel = chanel
self.details = details
threading.Thread.__init__(self)

def run(self):
print self.chanel.recv(4096)
self.chanel.close()




serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
serv.bind(('localhost', ‘88’))
serv.listen(5)

while True:
channel, details = serv.accept()
Root_tr(channel, details).start()
хм, не пашет, чемто ему bind не нравется. И недопонимаю где здесь можно начать продолжать произвольный код (цикл отправки), но при етом чтоб thread уже был запущен. Если можно, по подробней.
hellslade
по уму for действительно не нужен, он выполняется один раз с i=0 для запуска потока.
ексепшн возникает т.к. вы передаете функции reciver параметры (i, 100), которых у нее не должно быть.
запускайте поток без параметров или включите их в функцию. thread.start_new(reciver, ())
пробовал, если убрать for и параметры в start_new, тоесть сделать так: thread.start_new(reciver())
то reciver запускается и крутится, замкнутым циклом, не в thread'е, и я не могу работать с циклом отправки.



Офлайн

#6 Июль 9, 2008 06:11:12

hellslade
От:
Зарегистрирован: 2008-01-28
Сообщения: 240
Репутация: +  0  -
Профиль   Отправить e-mail  

thread

Hider
дак еще бы reciver запускался в отдельном потоке…
вы ж неправильно пишите….

Hider
thread.start_new(reciver())
обратите внимание на синтаксис!
hellslade
thread.start_new(reciver, ())
при запуске треда, после названия функции НЕ НУЖНЫ скобки, нужна запятая :) а после нее скобки с параметрами.
если вы указали скобки после названия функции, то поток не создается, а запускается непосредственно сама функция и крутится в цикле.
вот поэтому вы и не можете работать с циклом отправки.



Офлайн

#7 Июль 9, 2008 20:12:41

Hider
От:
Зарегистрирован: 2008-05-12
Сообщения: 16
Репутация: +  0  -
Профиль   Отправить e-mail  

thread

hellslade
Hider
дак еще бы reciver запускался в отдельном потоке…
вы ж неправильно пишите….
Hider
thread.start_new(reciver())
обратите внимание на синтаксис!
hellslade
thread.start_new(reciver, ())
при запуске треда, после названия функции НЕ НУЖНЫ скобки, нужна запятая :) а после нее скобки с параметрами.
если вы указали скобки после названия функции, то поток не создается, а запускается непосредственно сама функция и крутится в цикле.
вот поэтому вы и не можете работать с циклом отправки.
сенкс, заработало! =)



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version