2010-08-05 2 views
0

У меня есть два определения или методы в python. Я хотел бы запустить их в одно и то же время. Первоначально я пытался использовать forking, но поскольку ребенок сохранил память от родителя, он пишет несколько вещей, которые мне не нужны в файле. Поэтому я переключился на резьбу.Threading in Python

У меня есть что-то похожее на

import threading 
class test(threading.Thread) 
    def __init__(self,numA, list): 
      self.__numA=numA # (random number) 
      self.__list=list #(list) 
    def run(self): 
      makelist(self) 
      makelist2(self) 

makelist() и makelist2() использования numA и list. Таким образом, в этих определениях/методов, а не говоря

print list 

Я говорю

print self.__list. 

В основной() я создал новый объект класса:

x = test() 
x.start() 

Когда я запускаю мою программу I получить ошибку атрибута, говоря, что он не может распознать __list или __numA.

Я застрял на этом некоторое время. Если есть еще один лучший способ одновременного запуска двух методов (методы вообще не связаны), пожалуйста, сообщите мне об этом и объясните, как это сделать.

спасибо.

+0

Способы 'makelist' и' makelist2' 'test' или отдельных функций? –

+0

«нечто похожее» не позволяет нам понять, в чем проблема. Пожалуйста, покажите свой код, который вы выполнили, и возникла ошибка. – msw

+0

Я бы показал свой код, но не могу, так как это для работы. Кроме того, я смог понять это. Благодарю. – ykmizu

ответ

0

Пара вещей:

A) Если переопределить метод __init__ из threading.Thread объекта, который необходимо инициализировать threading.Thread самостоятельно, которое может быть достигнуто путем ввода «threading.Thread .__ INIT __ (Я) «в конце функции __init__

B) Поскольку msw указал, что вызовы« makelist »и« makelist2 »кажутся глобальными функциями, которые побеждает цель потоковой передачи. Я рекомендую сделать их функциями теста.

1

__list и __numA не будут видны из makelist и makelist2, если они также не являются членами одного и того же класса. Двойное подчеркивание будет делать вещи, как это не в состоянии:

>>> class A(object): 
... def __init__(self): 
...  self.__a = 2 
... 
>>> def f(x): 
... print x.__a 
... 
>>> a = A() 
>>> f(a) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 2, in f 
AttributeError: 'A' object has no attribute '__a' 

Но, называя __a что-то без два ведущих подчеркивания будет работать. Это то, что вы видите?

В документации по python вы можете узнать больше о private variables.

1

Во-первых, не называйте свою переменную такой же, как встроенные типы или функции, то есть список.

Во-вторых. а также проблемы, которые другие указали (__ имя mangling, initialization Thread и т. д.), если вы намерены одновременно запускать makelist и makelist2, то вы делаете это неправильно, так как ваш метод запуска все равно будет выполнять их после другой. Вам нужно запустить их в отдельных потоках, а не последовательно в том же потоке.

В-третьих, насколько точным вы имеете в виду «то же точное время»? Использование потоков в (C) Python физически невозможно, так как выполнение будет чередоваться на уровне байт-кода.Другие версии Python (Jython, IronPython и т. Д.) Могут запускать их в одно и то же время в многоядерной системе, но даже тогда у вас нет контроля над тем, когда планировщик ОС запустит каждый.

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

+0

Большое вам спасибо! Я сделал отдельные потоки, и это сработало. – ykmizu

1

Я хотел бы запустить их в одно и то же время.

Вы не можете сделать это с threading: Global Interpreter Lock в Python гарантирует, что только один поток может выполнять код Python в любое время (потоки переключаются каждые sys.getcheckinterval() байткод). Используйте вместо этого multiprocessing:

from multiprocessing import Process 
import os 

def info(title): 
    print title 
    print 'module name:', __name__ 
    print 'parent process:', os.getppid() 
    print 'process id:', os.getpid() 

def f(name): 
    info('function f') 
    print 'hello', name 

if __name__ == '__main__': 
    info('main line') 
    p = Process(target=f, args=('bob',)) 
    p.start() 
    p.join()