并发编程之线程

Posted st-st

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了并发编程之线程相关的知识,希望对你有一定的参考价值。

一、进程创建的机制

进程是计算机中最小的资源分配单位

进程对于操作系统来说还是有一定的负担

创建一个进程,操作系统要分配的资源大致:代码、数据、文件

存放代码到内存,存储数据到内存空间,文件,系统分配需要时间,占用的空间也比较大

 

二、线程

随着对并发的要求越来越高,无限开启进程是不现实的,解决高并发下进程的问题,使用线程。

线程是轻量级的概念,它没有属于自己的进程资源

一条线程只负责执行代码,没有自己独立的代码、变量、文件资源,线程都是共享资源

线程是计算机中被CPU调度的最小单位,计算机当中的CPU都是执行线程中的代码

 

三、进程和线程之间的关系

每一个进程中都有至少一条线程在工作,一个进程可以有多个线程

 

四、线程的特点:

① 同一个进程中的所有线程的内存空间、资源都是共享的

② 轻量级,没有自己的资源

③ 线程之间的切换很近,也很快,进程之间切换比较慢,进程占用资源多

④ 轻型实体

⑤ 独立调度和分配的基本单位

⑥ 共享进程资源

⑦ 并发执行

 

五、线程的分类

用户级线程:操作线程,操作系统的内核只能通过进程去执行线程

内核级线程:操作系统能够直接调度线程

混合实现:用户能查看调度线程,内核也能调度线程

 

六、进程和线程之间的区别

① 占用的资源

② 调度的效率

③ 资源是否共享

 

七、python中的线程

一个线程中的多个线程不能并线,由于python是解释型语言,所有的解释型语言都不能并行多个进程。

GIL锁:全局解释器锁,为了线程的安全

由于CPython解释器的原因,内部有一个全局解释器锁,所以线程不能充分的利用多核,只能同一时刻同一个进程中的线程只有一个能被CPU执行

GIL锁目前是能够提高线程切换的效率,但也确实限制了程序的效率

 

八、线程的创建

Thread模块比较老,Threading模块比较新,而且更高级,两个模块不能一起使用

import os
from threading import Thread

def func():
    print(子线程,os.getpid())

print(主线程,os.getpid())
for i in range(2):
    t = Thread(target=func)         # 创建子线程
    t.start()
    
‘‘‘
主线程 8076
子线程 8076
子线程 8076
‘‘‘

 

轻量级

线程比进程的运行效率高

import os,time
from multiprocessing import Process
from threading import Thread

def func():
    print(进程号:,os.getpid())

if __name__ == __main__:
    # 创建线程
    start = time.time()
    t_lis = []
    for i in range(100):
        t = Thread(target=func)
        t.start()
        t_lis.append(t)
    for t in t_lis:t.join()     # 保障线程全部执行完毕
    tt = time.time() - start

    # 创建进程
    start = time.time()
    p_lis = []
    for i in range(100):
        p = Process(target=func)
        p.start()
        p_lis.append(p)
    for p in p_lis:p.join()
    pt = time.time() - start

    print(tt,pt)            # 统计线程和进程所运行的时间

    # 0.02799248695373535 2.422297239303589

 

数据共享

from threading import Thread

count = 100
def func():
    global count
    count -= 1

t_lis = []
for i in range(100):
    t = Thread(target=func)
    t.start()
    t_lis.append(t)
for t in t_lis:t.join()
print(count)        # 0

 

以上是关于并发编程之线程的主要内容,如果未能解决你的问题,请参考以下文章

转:Java并发编程之十九:并发新特性—Executor框架与线程池(含代码)

并发编程之线程

Java并发编程之美之并发编程线程基础

转:Java并发编程之二:线程中断(含代码)

并发编程补充知识之标准线程池

Java并发编程之线程安全线程通信