Форум сайта python.su
имеется такая проблема, нужно писать в сокет и принимать на нем, одновременно, почитал о 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)
...
Офлайн
из примеров:
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)
Офлайн
по уму for действительно не нужен, он выполняется один раз с i=0 для запуска потока.
ексепшн возникает т.к. вы передаете функции reciver параметры (i, 100), которых у нее не должно быть.
запускайте поток без параметров или включите их в функцию. thread.start_new(reciver, ())
Офлайн
или пусть reciever принимает параметры =)
Офлайн
ZioNхм, не пашет, чемто ему bind не нравется. И недопонимаю где здесь можно начать продолжать произвольный код (цикл отправки), но при етом чтоб 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()
hellsladeпробовал, если убрать for и параметры в start_new, тоесть сделать так: thread.start_new(reciver())
по уму for действительно не нужен, он выполняется один раз с i=0 для запуска потока.
ексепшн возникает т.к. вы передаете функции reciver параметры (i, 100), которых у нее не должно быть.
запускайте поток без параметров или включите их в функцию. thread.start_new(reciver, ())
Офлайн
Hider
дак еще бы reciver запускался в отдельном потоке…
вы ж неправильно пишите….
Hiderобратите внимание на синтаксис!
thread.start_new(reciver())
hellsladeпри запуске треда, после названия функции НЕ НУЖНЫ скобки, нужна запятая :) а после нее скобки с параметрами.
thread.start_new(reciver, ())
Офлайн
hellsladeсенкс, заработало! =)
Hider
дак еще бы reciver запускался в отдельном потоке…
вы ж неправильно пишите….Hiderобратите внимание на синтаксис!
thread.start_new(reciver())hellsladeпри запуске треда, после названия функции НЕ НУЖНЫ скобки, нужна запятая :) а после нее скобки с параметрами.
thread.start_new(reciver, ())
если вы указали скобки после названия функции, то поток не создается, а запускается непосредственно сама функция и крутится в цикле.
вот поэтому вы и не можете работать с циклом отправки.
Офлайн