Python中的线程
我在python中有两个定义或方法。我想在同一时间运行它们。最初我尝试使用forking,但由于孩子保留了来自父母的内存,所以它在一个文件中写入了许多我不需要的东西。所以我转而使用线程技术 我有一些类似的东西Python中的线程,python,multithreading,Python,Multithreading,我在python中有两个定义或方法。我想在同一时间运行它们。最初我尝试使用forking,但由于孩子保留了来自父母的内存,所以它在一个文件中写入了许多我不需要的东西。所以我转而使用线程技术 我有一些类似的东西 import threading class test(threading.Thread) def __init__(self,numA, list): self.__numA=numA # (random number) self.__
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()
当我运行程序时,我得到一个属性错误,表示它无法识别\uu列表
或\uu numA
我已经在这上面呆了一段时间了。如果有其他更好的方法可以同时运行两个方法(这些方法根本没有连接),请通知我,并解释如何运行
多谢各位 有几件事:
A) 当您重写threading.Thread对象的_init___方法时,您需要自己初始化threading.Thread,这可以通过将“threading.Thread._init__(self)”放在_init___函数的末尾来完成
B) 正如msw指出的,对“makelist”和“makelist2”的调用似乎是对全局函数的调用
违背了线程的目的。我建议让它们具有测试功能 有几件事:
A) 当您重写threading.Thread对象的_init___方法时,您需要自己初始化threading.Thread,这可以通过将“threading.Thread._init__(self)”放在_init___函数的末尾来完成
B) 正如msw指出的,对“makelist”和“makelist2”的调用似乎是对全局函数的调用
违背了线程的目的。我建议让它们具有测试功能 如果_列表和_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类(对象):
... 定义初始化(自):
... 自我评价a=2
...
>>>def f(x):
... 打印x.。\uuu a
...
>>>a=a()
>>>f(a)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“”,第2行,在f中
AttributeError:“A”对象没有属性“\uu A”
但是,将_u命名为一个没有两个前导下划线的东西是可行的。这就是你看到的吗
您可以在python文档中阅读更多信息。如果makelist和makelist2不是同一类的成员,那么它们将无法从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类(对象):
... 定义初始化(自):
... 自我评价a=2
...
>>>def f(x):
... 打印x.。\uuu a
...
>>>a=a()
>>>f(a)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“”,第2行,在f中
AttributeError:“A”对象没有属性“\uu A”
但是,将_u命名为一个没有两个前导下划线的东西是可行的。这就是你看到的吗
您可以在python文档中阅读更多信息。首先,不要将变量命名为与内置类型或函数相同的名称,即list 其次。以及其他人指出的问题(
\uuuu
名称损坏、初始化线程等),如果您打算同时运行makelist和makelist2,那么您就错了,因为您的run方法仍然会一个接一个地执行它们。您需要在单独的线程中运行它们,而不是在同一个线程中按顺序运行它们
第三,你所说的“同样精确的时间”是指多精确?在(C)Python中使用线程这在物理上是不可能的,因为执行将在字节码级别进行交叉。Python的其他版本(Jython、IronPython等)可能会在多核系统上同时运行它们,但即使这样,您也无法控制OS调度器何时启动每一个
最后,在线程之间共享可变对象是一个坏主意,因为如果两个线程同时更改数据,那么不可预知的事情就会发生。您需要通过使用锁或只传递不可变数据或数据副本来防止这种情况。如果不小心,使用锁也会导致自身的问题,例如死锁。首先,不要将变量命名为与内置类型或函数相同的名称,即列表 其次。以及其他人指出的问题(
\uuuu
名称损坏、初始化线程等),如果您打算同时运行makelist和makelist2,那么您就错了,因为您的run方法仍然会一个接一个地执行它们。您需要在单独的线程中运行它们,而不是在同一个线程中按顺序运行它们
第三,你所说的“同样精确的时间”是指多精确?在(C)Python中使用线程这在物理上是不可能的,因为执行将在字节码级别进行交叉。Python的其他版本(Jython、IronPython等)可能会在多核系统上同时运行它们,但即使这样,您也无法控制OS调度器何时启动每一个
最后,在线程之间共享可变对象是一个坏主意,因为如果两个线程同时更改数据,那么不可预知的事情就会发生。您需要通过使用锁或只传递不可变数据或数据副本来防止这种情况。如果不小心,使用锁也会导致自身问题,例如死锁
我想在同一时间运行它们
使用线程处理无法做到这一点:Python中的确保在任何时候只有一个线程可以执行Python代码(线程每sys.getcheckinterval()
字节码切换一次)。改用:
我想在同一时间运行它们
使用线程处理无法做到这一点:Python中的线程确保在任何时候只有一个线程可以执行Python代码(t