Python Thread While While阻塞程序的其余部分?

时间:2018-02-03 05:56:18

标签: python multithreading

也许我只是不明白Threading是如何完全在Python中运行的,但根据我的理解,以下代码应该能够同时执行两个循环。

from threading import Thread

class minerThread(Thread):
    def __init__(self):
        Thread.__init__(self)
        self.daemon = True
    def startMining(self,mineFunc):
        while True:
            print "geg"


def Main():
    go=1
    miner=minerThread()
    miner.start()
    miner.startMining("addr")
    while go>0:
        print "mine"


#Enter main loop
if(__name__ == "__main__"):
    Main()

但是,程序只是挂在线程的startMining循环上。

有谁知道最近发生了什么?

1 个答案:

答案 0 :(得分:1)

CPython有一个叫GIL Global-Interpreter-Lock )的东西,它可以防止2个线程同时执行。

请参阅:https://wiki.python.org/moin/GlobalInterpreterLock

  

在CPython中,全局解释器锁或GIL是一个互斥锁,用于保护对Python对象的访问,防止多个线程同时执行Python字节码。这种锁是必要的,主要是因为CPython的内存管理不是线程安全的。 (但是,由于存在GIL,其他功能已经增长,取决于它所强制执行的保证。)

Python中的线程更适合IO绑定任务,其中一个线程阻塞输入并允许其他线程执行。

您尝试做的事情(以非常尴尬的方式)是CPU绑定的,并且一次只执行一个线程。在确定数量的OpCode中,在线程之间切换。购买你的线程不会同时执行。

如果要同时执行,则应该查看multiprocessing模块

请参阅:https://docs.python.org/3/library/multiprocessing.html

注意:在线程代码中,您正在从主线程和第二个线程执行相同的代码。两者都打印相同的字符串,因此您很难识别解释器是否在线程之间切换