做外贸要做什么网站,网络营销企业网站设计,长沙旅游网站开发,wordpress相关文章tag总所周知Python由于GIL的问题#xff0c;使用多线程时同一时刻只有一个线程在工作。故Python会在所有线程之间不断的切换#xff0c;每切换到一个线程会执行一段字节码指令然后切换到另一个线程。如果开启了很多线程#xff0c;且只有小部分线程在工作#xff0c;如果不休眠…总所周知Python由于GIL的问题使用多线程时同一时刻只有一个线程在工作。故Python会在所有线程之间不断的切换每切换到一个线程会执行一段字节码指令然后切换到另一个线程。如果开启了很多线程且只有小部分线程在工作如果不休眠部分线程那么每次切换到非工作线程时就会一直空转浪费资源从而拖慢了整体效率。例如下面示例代码总共启动了20个线程随机分发100个计算10000阶乘的任务。
import time
import random
import threading
from queue import Queuerandom.seed(1234)
count 0
lock threading.Lock()def task(v: int):res 1for i in range(1, v 1):res res * idef worker(input_queue: Queue):global countwhile True:if input_queue.empty():continuev input_queue.get()task(v)with lock:count 1if __name__ __main__:num_workers 20num_tasks 100queues [Queue() for _ in range(num_workers)]threads [threading.Thread(targetworker, args(queues[i],)) for i in range(num_workers)]for thread in threads:thread.daemon Truefor thread in threads:thread.start()time.sleep(1)t0 time.perf_counter()for _ in range(num_tasks):idx random.randint(0, num_workers - 1)queues[idx].put(10000)t1 time.perf_counter()print(fput time: {t1 - t0:.5f})while count ! num_tasks:continuet2 time.perf_counter()print(ftotal time: {t2 - t0:.5f})
终端输出如下
put time: 24.91427
total time: 26.17514如果将worker中的continue换成time.sleep(0.02)再次执行终端输出如下
put time: 0.00038
total time: 1.03202可以看到通过time.sleep方法让暂时没工作的线程休眠一会将更多的工作机会提供给真正需要工作的线程从而提升了整体效率。