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