【python】并发编程——多线程

1 一些概念

1.1 线程概念

线程是程序的执行单元,CPU执行的是线程。它包含线程ID,程序计数器,寄存器组,堆栈,线程和同一进程内的其他线程共享代码段,数据段和其他操作系统资源(打开文件,信号)。
TCB包含的内容:线程ID(Thread Identifier),栈指针(Stack pointer),程序计数器(Program counter),线程状态(Thread State:running,ready,waiting,starting,done),线程寄存器(Thread’s register set),父进程指针(Parent process pointer,指向PCB)
在这里插入图片描述

1.2 线程模型

线程类型有内核线程和用户线程,内核线程和用户线程的对应关系构成线程模型。

1.2.1 多对一

多个用户线程对应一个内核线程,用户空间的线程库完成线程管理。一个线程执行阻塞的系统调用则整个进程阻塞。同一时间只能有一个线程访问内核,则多线程无法并行运行在多核系统上。Solaris

1.2.2 一对一

一个用户线程对应一个内核线程。可以并发执行在多核处理器上。创建一个用户线程就要创建一个内核线程,开销大。Linux,Windows

1.2.3 多对多

多个用户线程映射到相同数量或者更少的内核线程上。如果一个用户线程执行阻塞系统调用则内核可以切换另一个内核线程运行。同时,多个内核线程也可以发挥多核处理器优势。

1.2.4 双层模型

多对多加上一对一。Solaris第九版以前。

2 Thread in Python

标准CPython实现使用GIL,GIL限制一次只能执行一个Python线程,所以Python多线程是并发视角下的,多个线程交替执行,而非每时每刻运行。如果要并行执行任务,采用multiprocessing,使用其他支持并行的非标准Python实现,使用其他支持并行的编程语言。可以使用多线程执行I/O密集型任务,但不建议执行CPU密集型任务。

2.1 threading

2.1.1 示例

from threading import Thread


def thread_func(x):
    return x * x


if __name__ == '__main__':
    threads = list()
    for ind in range(3):
        t = Thread(target=thread_func, args=(ind,))
        threads.append(t)
        t.start()

    for ind, thread in enumerate(threads):
        thread.join()  # 阻塞直到对应的线程执行完毕
        print(thread)

2.1.2 关于线程返回值

设置保存运行结果的全局变量
from threading import Thread


def foo(bar, results, index):
    print('hello {0}: {1}'.format(bar, index)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值