【问题标题】:Python Multi-Threading BasicsPython 多线程基础
【发布时间】:2021-06-14 04:50:49
【问题描述】:

我无法理解如何让简单的多线程在 python 中工作。这是我用 python 编写的一个简单脚本,它应该同时写入两个不同的文件:

from threading import Thread
import time

def function(file):
    with open(file, 'w') as f:
        i = 0
        while i < 10:
            print(file + ' printing ' + str(i))
            f.write(str(i) + '\n')
            time.sleep(0.4)
            i += 1

if __name__ == '__main__':
    thr1 = Thread(target=function('thr1.txt'))
    thr2 = Thread(target=function('thr2.txt'))

    thr1.start()
    thr2.start()

这段代码运行的输出表明这些函数不是并行执行的,而是一个接一个地执行:

thr1.txt printing 0
thr1.txt printing 1
thr1.txt printing 2
thr1.txt printing 3
thr1.txt printing 4
thr1.txt printing 5
thr1.txt printing 6
thr1.txt printing 7
thr1.txt printing 8
thr1.txt printing 9
thr2.txt printing 0
thr2.txt printing 1
thr2.txt printing 2
thr2.txt printing 3
thr2.txt printing 4
thr2.txt printing 5
thr2.txt printing 6
thr2.txt printing 7
thr2.txt printing 8
thr2.txt printing 9

Process finished with exit code 0

我是否误解了 python 中多线程函数的基础知识,因为从我查看的资源来看,这似乎是它的完成方式?

【问题讨论】:

    标签: python multithreading python-multithreading


    【解决方案1】:

    这里:

        thr1 = Thread(target=function('thr1.txt'))
        thr2 = Thread(target=function('thr2.txt'))
    

    function 的调用会被热切评估。基本上,您将调用function 的结果作为target 传递给Thread。所以你的函数甚至在线程创建之前就被执行了。

    您需要做的是传递要调用的函数的名称及其参数 - 不调用函数。

    thr1 = Thread(target=function, args=('thr1.txt',))
    thr2 = Thread(target=function, args=('thr2.txt',))
    

    这会按预期产生交错输出:

    thr1.txt printing 0
    thr2.txt printing 0
    thr2.txt printing 1
    thr1.txt printing 1
    thr2.txt printing 2thr1.txt printing 2
    
    thr2.txt printing 3thr1.txt printing 3
    
    thr2.txt printing 4
    thr1.txt printing 4
    thr1.txt printing 5
    thr2.txt printing 5
    thr2.txt printing 6
    thr1.txt printing 6
    thr2.txt printing 7
    thr1.txt printing 7
    thr1.txt printing 8thr2.txt printing 8
    
    thr2.txt printing 9thr1.txt printing 9
    

    【讨论】:

    • +1 我正在写类似的东西。我认为还值得注意的是,@Cameron,Python 实际上 并没有以真正的并行方式执行 GIL 中的线程。参考here
    • @Felipe 实际上,在这个例子中,如果操作系统允许,它们几乎确实并行执行,并在不同的核心调度线程。两个线程都是 IO 绑定的(因为它们所做的只是暂停和写入屏幕)。现在,这当然是一个有点愚蠢的例子,总的来说,你所说的仍然有效。但仍然需要注意的是,对于 IO 绑定程序,线程可以“真正”并行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多