python - 在线程中调用 run 以外的方法

标签 python multithreading concurrency python-multithreading

我正在学习 Python 中的线程,我对我编写的以下代码感到困惑。启动 Heartbeat 线程后,stuff 方法调用相对于 run 方法如何工作?是否存在关于 i 的竞争条件,如果有,我该如何防止这种情况发生?

我想知道这种类型的构造是否可以有效地用于与线程通信。但是,就激活 runHeartbeat 类中的方法调用而言,我不明白它在幕后是如何工作的。我假设 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

编辑:在我看来,由于几个原因,这个问题与建议的重复问题不同。这是一个简单得多的问题,具有非常具体的观点,而另一个问题则是关于多线程的一般问题。答案非常有帮助,但据我所知,我没有看到任何解释我的情况的内部工作原理的内容,也没有对从不同线程调用其他方法的解释。如果存在的话,可能超出了初学者完全理解的范围;这个问题比较简单,也更切题,所以我认为它有一席之地。

最佳答案

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

关于python - 在线程中调用 run 以外的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54369339/

相关文章:

python - 使用pymysql连接mysql时出现Flask错误

python - 按行组合列表 (Python)

java - 如何使 Java 线程获得相当数量的 CPU 时间

java - 为什么自定义阻塞队列在 Java 中不是线程安全的

scala - Scala Actor 中的 Thread.sleep

multithreading - Erlang中Actor的基本解释

Python Mechanize - 如何在单个 .open() 调用上添加 header ?

python - 给定外部订单,按日期时间月份的 Pandas 订单行

c# - 使用 .AsParallel().ForAll 或 Parallel.ForEach 性能问题并行化任务

java - 如何在 Blackberry 中安排特定线程