为什么线程的参数在Python中有时会混淆?

为什么线程的参数在Python中有时会混淆?,python,multithreading,python-2.7,pycharm,python-multithreading,Python,Multithreading,Python 2.7,Pycharm,Python Multithreading,I代码基本线程程序: import threading 初始化线程 尝试的最后5个输出如下: ####try 1 0 1 2 3 4 ####try 2 0 1 2 3 4 ####try 3 0 2 23 4 ####try 4 0 1 2 3 4 ####try 5 0 1 3 34 我使用PyCharm作为IDE。 我不明白为什么会有空格字符,为什么更多的线程参数得到相同的值请阅读有关打印线程安全的更多信息 问题是python使用单独的操作码进行换行

I代码基本线程程序:

import threading 
初始化线程

尝试的最后5个输出如下:

####try 1 
0
1
2
3
4

####try 2 
0
1
 2
3
4

####try 3 
0
2
23

4



####try 4 

0
1
2
3
 4

####try 5 

0
1
3
 34
我使用PyCharm作为IDE。
我不明白为什么会有空格字符,为什么更多的线程参数得到相同的值

请阅读有关打印线程安全的更多信息

问题是python使用单独的操作码进行换行打印和对象本身的打印。最简单的解决方案可能只是使用显式sys.stdout.write和显式换行符。或者使用锁定并重新绑定“打印”!或者使用日志系统

from __future__ import print_function
print = lambda x: sys.stdout.write("%s\n" % x)


在python3中打印是安全的。

打印线程不安全是否也会损坏输出?似乎输出中的数字也不正确,没有考虑到新线。@all3g我能理解新线问题,我不在乎。但我不理解输出中显示的空格字符和线程的相同参数值。我尝试了您的代码,但线程仍然获得相同的threadID值。请将thread.threadID也更正为self.threadID。如果在thread.start()之后添加thread.join(),如果其中一个线程未完成,则无法创建另一个线程。这就省去了多线程的优点,我希望所有线程都能一起工作。我不知道为什么,但使用self.threadID代替thread.threadID,解决相同的值问题。但空间角色问题仍然存在。
from __future__ import print_function
print = lambda x: sys.stdout.write("%s\n" % x)
import threading
import logging

logging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger('thread-safe')

class OpenThread (threading.Thread):
    def __init__(self, threadID):
        threading.Thread.__init__(self)
        self.threadID = threadID

    def run(self):
        logger.debug(thread.threadID)

for tID in range(0, 5):
    thread = OpenThread(tID)
    thread.start()