Python线程()是否删除换行符?

2024-04-26 01:20:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我在程序中遇到了一个特殊的错误。代码背后的一般思想是,首先创建一个由5个列表组成的数组(称为lists\u of_nums)。每个列表由1到10000范围内的100个数字组成。然后程序运行5个线程。每一个都会找到单个列表的平均值,并打印执行此操作所需的时间

您会注意到threading_函数()中print()语句的末尾有一个换行符。就在上面写着“秒。\n”的地方

问题是,如果我将't.join()'放在一个单独的'for'循环中(代码的最底层),以便同时运行线程,那么换行符有时会被删除(显然)。如果我逐个单独运行线程,它只能在100%的时间内工作

我希望有人能帮助我理解如何同时运行线程,并且仍然让新行可靠

让我用一个代码示例及其错误输出(只在某些时候发生)来说明我的意思:

lists_of_nums = []

def create_set():    # Function for creating a list of random integers and appending them to the lists_of_nums array.

    random_nums = []

    for _ in range(100):

        random_nums.append(randint(1, 10000))

    lists_of_nums.append(random_nums)

for _ in range(5):    # Five of these lists get appended to the array, by using the create_set() function.
    create_set()


def threading_function(list_index):    # Function responsible for finding the mean value of a given list as well as the time taken to do it.

    start = timeit.default_timer()

    mean_value = mean(lists_of_nums[list_index])

    end = timeit.default_timer() - start

    print(
        "The mean value of the list number " + str(list_index + 1) + " is " + str(mean_value) +
        "\nThe time taken to find it was " + str(end) + " seconds.\n" # The abovementioned newline.
        )

threads = []

for i in range(len(lists_of_nums)):

    t = Thread(target = threading_function, args = [i])
    t.start()
    threads.append(t)

for t in threads:    # If t.join() remains in a separate 'for' loop than the Thread() class, the newline occasionally disappears.
    t.join()

输出不正确,换行符似乎在打印语句3和4之间消失:

The mean value of the list number 1 is 5270.34
The time taken to find it was 0.00012170000000000236 seconds.

The mean value of the list number 2 is 4768.17
The time taken to find it was 9.239999999999943e-05 seconds.

The mean value of the list number 3 is 4766.67
The time taken to find it was 8.369999999999905e-05 seconds.
The mean value of the list number 4 is 4969.7
The time taken to find it was 9.880000000000305e-05 seconds.


The mean value of the list number 5 is 4686.21
The time taken to find it was 9.25000000000023e-05 seconds.

Tags: ofthetonumberfortimeisvalue
2条回答

字符串中的换行符是完整的print默认情况下,在后面添加一个换行符。它以单独的方式完成这项工作。来自不同线程的两次写入(原始字符串和换行符)可以交错,因此有时还会看到双空行。如果从字符串中删除换行符,您将看到类似的奇怪效果

一种解决方案是在两个换行符中结束字符串,并阻止print添加它自己的换行符,即print("....\n\n", end="")

新行正在打印中。注意,在语句4和5之间有一行额外的内容。您的线程之间可能存在竞争条件。尝试用锁保护print函数。即

printLock = threading.Lock() # global variable

然后

# inside threading_function
with printLock:
    print(
        "The mean value of the list number " + str(list_index + 1) + " is " + str(mean_value) +
        "\nThe time taken to find it was " + str(end) + " seconds.\n" # The abovementioned newline.
        )

相关问题 更多 >