我在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.
在main()中我创建了一个新的类对象:
x = test()
x.start()
当我运行程序时,我收到属性错误,指出它无法识别__list
或__numA
。
我已经坚持了一段时间。如果还有另一种更好的方法可以同时运行两种方法(方法根本没有连接),请告知我并解释如何。
谢谢。
答案 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”的调用似乎是全球函数 打败了线程的目的。我建议将它们作为测试功能。