Python中的线程

Python中的线程,python,multithreading,Python,Multithreading,我在python中有两个定义或方法。我想在同一时间运行它们。最初我尝试使用forking,但由于孩子保留了来自父母的内存,所以它在一个文件中写入了许多我不需要的东西。所以我转而使用线程技术 我有一些类似的东西 import threading class test(threading.Thread) def __init__(self,numA, list): self.__numA=numA # (random number) self.__

我在python中有两个定义或方法。我想在同一时间运行它们。最初我尝试使用forking,但由于孩子保留了来自父母的内存,所以它在一个文件中写入了许多我不需要的东西。所以我转而使用线程技术

我有一些类似的东西

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