为啥python脚本线程不起作用?

Posted

技术标签:

【中文标题】为啥python脚本线程不起作用?【英文标题】:Why python script threading is not working?为什么python脚本线程不起作用? 【发布时间】:2021-12-18 15:33:04 【问题描述】:

这段代码需要我大约 11 秒:

def task(numbers):
    print(f"Starting")
    for number in numbers:
        number**number
task(range(10000))
task(range(10000))

这和我一样:

def task(numbers):
    for number in numbers:
        number**number

start = time()

t1 = threading.Thread(target=task, args=(range(10000),))

t2 = threading.Thread(target=task, args=(range(10000),))

t1.start()
t2.start()


t1.join()
t2.join()

end = time()
print(end - start)

如果我使用 2 个线程,为什么这段代码不会占用一半时间?

【问题讨论】:

这能回答你的问题吗? python multi-threading slower than serial? 另请查看:***.com/q/18114285/4046632 你的 task 是 cpu-heavy,而不是 i/o-heavy,所以线程并没有加速任何事情。请改用多处理。 【参考方案1】:

线程适用于并行化输入/输出操作,例如。当您等待来自套接字的响应时,您可以在其他线程中做一些有用的事情,从而减少执行时间。但是如果你的操作真的很累,会消耗整个 CPU,那么线程会更慢,因为你在线程之间切换会有一些开销。

这里是一个稍微修改的例子,但是不是昂贵的操作x**x,而是只有sleep,结果和预期的一样。

from threading import Thread
from time import time, sleep

LOOPS = 10
TASKS = 5
SLEEP = 0.1

def task():
    for _ in range(LOOPS):
        sleep(SLEEP)

def timing(func):
    def wrapper():
        start = time()
        func()
        duration = time() - start
        print(duration)
    return wrapper

@timing
def serial():
    print("serial execution")
    for _ in range(TASKS):
        task()

@timing
def paralel():
    print("paralel execution")

    threads = []
    for _ in range(TASKS):
        t = Thread(target=task)
        threads.append(t)
        t.start()

    for t in threads:
        t.join()

def main():
    serial()
    paralel()

if __name__ == "__main__":
    main()
serial execution
5.0098230838775635
paralel execution
1.0120694637298584

【讨论】:

以上是关于为啥python脚本线程不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

简单的Python脚本不起作用

Python 多线程在 MacOS Monterey/Apple Silicon 上不起作用

使用 PhP 执行一些 python 脚本不起作用

双击时Python3 GUI脚本不起作用

串行 AT 命令在 python 脚本中不起作用,但在 Minicom 中起作用

试图在 Python 脚本中复制文件,但它不起作用