Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么我的蟒蛇3';s打印函数不是线程安全的?_Python_Python 3.x_Multithreading_Printing - Fatal编程技术网

Python 为什么我的蟒蛇3';s打印函数不是线程安全的?

Python 为什么我的蟒蛇3';s打印函数不是线程安全的?,python,python-3.x,multithreading,printing,Python,Python 3.x,Multithreading,Printing,这是我的代码,但屏幕上的输出不是我所期望的 import threading import time def foo_1(): for i in range(10): print ("foo_1: ") time.sleep(0.2) def foo_2(): for i in range(10): print("foo_2: ") time.sleep(0.2) t1=threading.Thread(target

这是我的代码,但屏幕上的输出不是我所期望的

import threading
import time
def foo_1():
    for i in range(10):
        print ("foo_1: ")
        time.sleep(0.2)
def foo_2():
    for i in range(10):
        print("foo_2: ")
        time.sleep(0.2)
t1=threading.Thread(target=foo_1)
t2=threading.Thread(target=foo_2)
t1.start()
t2.start()
这是输出,显然某些打印函数在睡眠前没有打印“\n”。我不知道为什么:(


您可以简单地使用锁使其线程安全

import threading
import time

lock = threading.Lock()

def foo_1():
    for i in range(10):
        with lock:
            print ("foo_1: ")
        time.sleep(0.2)

def foo_2():
    for i in range(10):
        with lock:
            print("foo_2: ")
        time.sleep(0.2)
t1=threading.Thread(target=foo_1)
t2=threading.Thread(target=foo_2)
t1.start()
t2.start()
导入线程
导入时间
lock=threading.lock()
def foo_1():
对于范围(10)内的i:
带锁:
打印(“foo_1:”)
睡眠时间(0.2)
def foo_2():
对于范围(10)内的i:
带锁:
打印(“foo_2:”)
睡眠时间(0.2)
t1=线程。线程(目标=foo_1)
t2=线程。线程(目标=foo_2)
t1.start()
t2.start()
或者,您可以定义自己的线程安全打印功能:

import threading
import time

lock = threading.Lock()

# thread safe print
def sprint(*args, **kwargs):
    with lock:
        print(*args, **kwargs)


def foo_1():
    for i in range(10):
        sprint ("foo_1: ")
        time.sleep(0.2)

def foo_2():
    for i in range(10):
        sprint("foo_2: ")
        time.sleep(0.2)

t1=threading.Thread(target=foo_1)
t2=threading.Thread(target=foo_2)
t1.start()
t2.start()
导入线程
导入时间
lock=threading.lock()
#线程安全打印
def sprint(*args,**kwargs):
带锁:
打印(*args,**kwargs)
def foo_1():
对于范围(10)内的i:
sprint(“foo_1:”)
睡眠时间(0.2)
def foo_2():
对于范围(10)内的i:
sprint(“foo_2:”)
睡眠时间(0.2)
t1=线程。线程(目标=foo_1)
t2=线程。线程(目标=foo_2)
t1.start()
t2.start()

您只需使用锁即可使其线程安全

import threading
import time

lock = threading.Lock()

def foo_1():
    for i in range(10):
        with lock:
            print ("foo_1: ")
        time.sleep(0.2)

def foo_2():
    for i in range(10):
        with lock:
            print("foo_2: ")
        time.sleep(0.2)
t1=threading.Thread(target=foo_1)
t2=threading.Thread(target=foo_2)
t1.start()
t2.start()
导入线程
导入时间
lock=threading.lock()
def foo_1():
对于范围(10)内的i:
带锁:
打印(“foo_1:”)
睡眠时间(0.2)
def foo_2():
对于范围(10)内的i:
带锁:
打印(“foo_2:”)
睡眠时间(0.2)
t1=线程。线程(目标=foo_1)
t2=线程。线程(目标=foo_2)
t1.start()
t2.start()
或者,您可以定义自己的线程安全打印功能:

import threading
import time

lock = threading.Lock()

# thread safe print
def sprint(*args, **kwargs):
    with lock:
        print(*args, **kwargs)


def foo_1():
    for i in range(10):
        sprint ("foo_1: ")
        time.sleep(0.2)

def foo_2():
    for i in range(10):
        sprint("foo_2: ")
        time.sleep(0.2)

t1=threading.Thread(target=foo_1)
t2=threading.Thread(target=foo_2)
t1.start()
t2.start()
导入线程
导入时间
lock=threading.lock()
#线程安全打印
def sprint(*args,**kwargs):
带锁:
打印(*args,**kwargs)
def foo_1():
对于范围(10)内的i:
sprint(“foo_1:”)
睡眠时间(0.2)
def foo_2():
对于范围(10)内的i:
sprint(“foo_2:”)
睡眠时间(0.2)
t1=线程。线程(目标=foo_1)
t2=线程。线程(目标=foo_2)
t1.start()
t2.start()

treading最糟糕的事情可能重复-bug很难复制。我没有成功。treading最糟糕的事情可能重复-bug很难复制。我没有成功。