为啥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 多线程在 MacOS Monterey/Apple Silicon 上不起作用