调用非在线程中运行的方法

时间:2019-01-25 16:34:13

标签: python multithreading concurrency python-multithreading

我正在学习Python中的线程,并且对下面编写的代码感到困惑。启动心跳线线程后,stuff方法调用相对于run方法如何工作?关于i是否存在比赛条件,如果有,我该如何防止?

我想知道这种构造类型是否可以有效地用于与线程通信。关于激活Heartbeat之后run类中的方法调用,我不了解它是如何工作的。我假设sleep允许stuff执行,但是我不知道为什么。我可能把这个复杂化了,却遗漏了一些明显的东西。但是,我缺乏直觉,令人不安。任何帮助或建议,将不胜感激。

   1 import threading
   2 import time
   3 
   4 class Heartbeat(threading.Thread):
   5   def __init__(self, delay):
   6     threading.Thread.__init__(self, daemon = True)
   7     self.delay = delay
   8     self.i = 0
   9   
  10   def run(self):
  11     while True:
  12       print("i = {}".format(self.i))
  13       time.sleep(self.delay)
  14   
  15   def stuff(self, i):
  16     self.i = i
  17 
  18 if __name__ == "__main__":
  19   hbThread = Heartbeat(3)
  20   hbThread.start()
  21   
  22   i = 0
  23   while True:
  24     time.sleep(1)
  25     i += 1
  26     hbThread.stuff(i)

输出:

i = 0
i = 2
i = 5
i = 8
i = 11

编辑:我认为,由于某些原因,该问题与建议的重复问题有所不同。这是一个非常简单的问题,具有很明确的意义,而另一个是关于多线程的广泛问题。答案非常有帮助,但据我所知,我看不到任何能解释我情况内部工作的信息,也没有解释从其他线程调用其他方法的解释。如果有的话,可能就超出了初学者的理解范围。这个问题更简单,更切合实际,所以我认为它有位置。

1 个答案:

答案 0 :(得分:1)

当您从Thread继承时,您的实例将像一个人,一只脚站在厨房,一只脚站在客厅。方法将在哪个线程中运行取决于您从哪个线程调用它。 run将成为新线程的主要功能,它调用的每个方法都在该线程中运行。如果从父级调用stuff,它将在MainThread中运行。由于GIL,一次只能运行一个线程。默认情况下,Python 3中的线程将保持GIL(因此能够执行Python代码)最多5毫秒,或者在阻塞I / O时(如time.sleep)更早将其删除。进程中的所有线程共享相同的内存,因此您可以从新线程和MainThread追加到实例,并且两者都可以访问数据。