【问题标题】: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 python-3.x multithreading


【解决方案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

【讨论】:

    猜你喜欢
    • 2017-05-30
    • 1970-01-01
    • 1970-01-01
    • 2013-11-18
    • 1970-01-01
    • 1970-01-01
    • 2020-12-14
    • 1970-01-01
    • 2015-06-16
    相关资源
    最近更新 更多