2013-10-01 4 views
0

Im пытается понять потоки (им новые для него), чтобы получить мой код лучше. На данный момент у меня есть класс в файле .py с некоторыми функциями.Проблемы с потоком Python

В принципе, я инициализирую объект для этого класса в каждой программе, которую у меня есть. Но, с потоками, я хотел бы иметь возможность создавать все эти объекты в одной программе и вызывать функцию с помощью потока.

def inicializa(): 
clientList = list() 
thread_list = list() 
config = configparser.ConfigParser() 
config.read("accounts.ini") 
for section in config.sections(): #define a section da conta que vou usar 
        email = config.get(section,'email') 
        password = config.get(section,'password') 
        the_hash = config.get(section,'hash') 
        authdata = config.get(section,'authdata') 
        authdata = eval(authdata) 
        client = MyClient(email,password,the_hash,authdata) 
        clientList.append(client) 


for client in clientList: 
    t = threading.Thread(target=client.getBla()) # this function is inside of my class, its work OK outside of the thread if i put client.getBla. 
    thread_list.append(t) 

for thread in thread_list: 
    thread.start() 

return clientList 

ошибка я получаю, когда я пытаюсь использовать нить, чтобы запустить функцию client.getBla является:

Исключение в потоке Тема-1: TypeError: INT объект не отозваны.

Моя функция dosnt принимает любые аргументы, поэтому я не знаю, что происходит, потому что i client.getBla() вне потоков работает нормально.

Спасибо всем.

ответ

1
t = threading.Thread(target=client.getBla()) 

Что делает эта линия оценить client.getBla() (который возвращает int) и передать его в качестве имени аргумента в тему. target аргумент принимает вызываемая, так что вы должны сделать это вместо того, чтобы:

t = threading.Thread(target=client.getBla) 

Делая это, вы передаете саму функцию, а не функции результата

+0

Вау, это было довольно быстрый ответ, я думаю, это сработало. Как я уже сказал, это мой первый раз с потоками, есть ли способ проверить, работают ли потоки одновременно, а не как «для»? –

+0

@JeffersonNeves - надежный способ сделать это, чтобы заблокировать поток, используя, например, 'time.sleep()'. Если вы выполняете спящие 1 секунду в 5 разных потоках, программа должна закончиться через 1 секунду, а не 5. – goncalopp

+0

не уверен, где использовать time.sleep(), но я попробую. Я опубликую результат в ближайшее время. Спасибо. –

Смежные вопросы