在Python中进行线程化

时间:2010-08-05 06:35:46

标签: python multithreading

我在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()使用numAlist。所以在那些定义/方法中而不是说

print list 

我说

print self.__list.

在main()中我创建了一个新的类对象:

x = test()
x.start()

当我运行程序时,我收到属性错误,指出它无法识别__list__numA

我已经坚持了一段时间。如果还有另一种更好的方法可以同时运行两种方法(方法根本没有连接),请告知我并解释如何。

谢谢。

4 个答案:

答案 0 :(得分:1)

如果makelist和makelist2不是同一个类的成员,则__list和__numA将不可见。双下划线会使这样的事情失败:

>>> 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 :(得分:1)

首先,不要将变量命名为内置类型或函数,即list。

其次。以及其他人指出的问题(__名称修改,初始化线程等),如果你的意图是同时运行makelist和makelist2然后你做错了,因为你的run方法仍然会一个接一个地执行它们。您需要在单独的线程中运行它们,而不是在同一个线程中顺序运行它们。

第三,“同一时间”的确切含义是多少?在(C)Python中使用线程这在物理上是不可能的,因为执行将在字节码级别交错。其他版本的Python(Jython,IronPython等)可以在多核系统上完全同时运行它们,但即使这样,您也无法控制OS调度程序何时启动每个版本。

最后,在线程之间共享可变对象是一个坏主意,因为如果两个线程同时更改数据,则可能(并且将会)发生不可预测的事情。您需要通过使用锁或仅传递不可变数据或数据副本来防止这种情况。如果不小心,使用锁也可能导致自身问题,例如死锁。

答案 2 :(得分:1)

  

我想在同一时间运行它们。

您无法使用threading执行此操作:Python中的Global Interpreter Lock可确保任何时候只有一个线程可以执行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()

答案 3 :(得分:0)

一些事情:

A)当你覆盖threading.Thread对象的__init__方法时,你需要初始化threading.Thread自己可以通过在__init__函数的末尾加上“threading.Thread .__ init __(self)”来实现

B)正如msw所指出的那些对“makelist”和“makelist2”的调用似乎是全球函数 打败了线程的目的。我建议将它们作为测试功能。