在python中为(multi?)线程使用相同的变量名

时间:2018-08-05 10:36:59

标签: python multithreading

我是python线程的新手,我首先创建了一个简单的程序,该程序使用两个线程来打印数字1-100。第一个线程打印所有的奇数,第二个线程打印所有的偶数。

最初,我遇到了一个问题,即我的线程只是以尽可能快的速度打印数字,因此数字并不一定总是按顺序排列。我不知道(也没有研究过)如何在python中同步线程,因此我实现了一种简单的技术,使用布尔标志并打开和关闭它们,并使用延迟来“同步”线程。 / p>

看着我的代码,我刚刚意识到我的标志和我的线程具有完全相同的变量名。

为什么python不抛出任何错误?

我的代码:

import time, threading

def printOdd():

    global odd, even

    for i in range(1, 101, 2):

        while not odd:
            time.sleep(0.01)

        if odd:
            print(i)
            odd = False
            even = True

def printEven():

    global odd, even

    for i in range(2, 101, 2):

        while not even:
            time.sleep(0.01)


        if even:
            print(i)
            odd = True
            even = False


odd = True
even = False

odd = threading.Thread(target = printOdd)
even = threading.Thread(target = printEven)

odd.daemon = True
even.daemon = True

odd.start()
even.start()

1 个答案:

答案 0 :(得分:1)

您会期望什么样的错误?

  1. Python是动态类型的,因此您可以毫无问题地将相同的变量分配给不同类型的对象;
  2. even, odd变量不再分配给线程对象并不意味着线程不运行,所以也很好;
  3. if condition:实际上是if bool(condition):,并且假设Thread对象是真实的,则第一个线程确实进入了第一个if语句并将even, odd变量分配给普通的布尔值。

很容易看到Thread对象确实是真实的:

>>> import threading
>>> th = threading.Thread(target=print)
>>> bool(th)
True