VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > 编程开发 > python爬虫 >
  • 多线程下每个线程的执行方式

在Python多线程下,每个线程的执行方式:
1、获取GIL
2、执行代码直到sleep或是python虚拟机将其挂起。
3、释放GIL

 GIL全局解析器锁(global interpreter lock),其作用在单核的情况下可以实现多任务(并发) 每个线程在执行时候都需要先获取GIL,保证同一时刻只有一个线程可以执行代码,即同一时刻只有一个线程使用CPU,也就是说多线程并不是真正意义上的同时执行

并行:多个CPU同时执行多个任务,就好像有两个程序,这两个程序是真的在两个不同的CPU内同时被执行。
并发:CPU交替处理多个任务,还是有两个程序,但是只有一个CPU,会交替处理这两个程序,而不是同时执行,只不过因为CPU执行的速度过快,而会使得人们感到是在“同时”执行,执行的先后取决于各个程序对于时间片资源的争夺。并行和并发同属于多任务,目的是要提高CPU的使用效率。这里需要注意的是,一个CPU永远不可能实现并行,即一个CPU不能同时运行多个程序,但是可以在随机分配的时间片内交替执行(并发),就好像一个人不能同时看两本书,但是却能够先看第一本书半分钟,再看第二本书半分钟,这样来回切换。

多线程并不会充分调用两个CPU,而是会像在一个CPU上充分运转,而多进程则是会完全调用两个CPU,同时执行;
对于任何Python程序,不管有多少的处理器,任何时候都总是只有一个线程在执行。

Python 多线程实例
import threading
from queue import Queue
def list_Avg(list_1):
    # 取列表值的总和
    Len = len(list_1)
    total=0
    for i in range(0, len(list_1)):
        total = total + list_1[i]
    Avg = total / Len
    return Avg
def job(li, q):
    q.put(list_Avg(li))   # 将任务的执行结果存储到队列中;
def use_thread():
    # 实例化一个队列, 用来存储每个线程执行的结果
    q = Queue()
    list1 = [range(6), range(6,18), range(1000, 6000)]
    # 创建线程列表
    threads = []
    for li in list1:
        t = threading.Thread(target=job, args=(li, q))
        t.start()
        threads.append(t)
    for thread in threads:
        thread.join()
        # 等待队列中所有线程完成;
    results = []
    for li in list1:
        results.append(q.get())
    print(results)
if __name__ == "__main__":
    use_thread()



相关教程