Python线程运行()阻塞

标签 python python-3.x multithreading python-multithreading

当我创建以下内容时,我试图创建一个可以被异常终止的线程类(因为我试图让线程等待一个事件):

import sys

class testThread(threading.Thread):
    def __init__(self):
        super(testThread,self).__init__()
        self.daemon = True

    def run(self):
        try:
            print('Running')
            while 1:
                pass
        except:
            print('Being forced to exit')

test1 = testThread()
test2 = testThread()

print(test1.daemon)
test1.run()
test2.run()

sys.exit()

但是,运行程序只会打印出一条Running消息,直到另一条终止。这是为什么?

最佳答案

问题是您正在调用 run方法。

这只是您实现的一个普通的旧方法,它会执行您放入其主体中的任何操作。在这种情况下,正文是一个无限循环,因此调用 run 只会永远循环下去。

启动线程的方式是start方法。此方法是 Thread 类的一部分,它的作用是:

Start the thread’s activity.

It must be called at most once per thread object. It arranges for the object’s run() method to be invoked in a separate thread of control.

因此,如果您调用它,它将启动一个新线程,使该新线程运行您的 run() 方法,并立即返回,因此主线程可以继续做其他事情。< sup>1 这就是你想要的。


<子>1。正如让-弗朗索瓦·法 bool (Jean-François Fabre) 所指出的,您仍然不会在这里获得任何真正的并行性。繁忙循环在多线程代码中从来都不是一个好主意,如果你在 CPython 或 PyPy 中运行它,几乎所有的繁忙循环都是在执行 Python 字节码的同时持有 GIL,并且一次只有一个线程可以持有 GIL。因此,从粗略的角度来看,事情看起来是并发的——三个线程在运行,并且都在取得进展。但如果放大,两个线程同时进行的地方几乎没有重叠,通常甚至不足以弥补较小的调度程序开销。

关于Python线程运行()阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51493839/

相关文章:

python - 应用的 Pandas 替代方案 - 基于多列创建新列

具有静态方法和对自身的引用的 Python 类

python - python typing 模块中的 Set、FrozenSet、MutableSet 和 AbstractSet 之间有什么区别?

python - 从字符串中删除字符的特定实例

python - 如何比较 DataFrame 的 3 列,Python 3.6

python - 互斥体适用于快速的单一作者/缓慢的读者(cpython)?

python - SQL 查询结果将日期列报告为字符串,但在获取日期数据类型时遇到问题

java - Collections.synchronizedList 与 vector

c# - 通过引用传递的多个线程访问的静态方法

python - 如何在 Django 2 模板中生成绝对 URL