python 系列之 - 多线程

本文介绍了Python中的多线程概念,包括进程与线程的区别,重点讨论了全局解释器锁(GIL)对Python多线程的影响。文章还详细讲解了线程的创建和管理,如setName()、getName()、setDaemon()、join()、线程锁、event()和Semaphore()等,并通过实例展示了它们的应用。
摘要由CSDN通过智能技术生成

进程 && 线程
进程:是内存中的一个独立的句柄,我们可以理解为一个应用程序在内存中就是一个进程。 各个进程之间是内存相互独立,不可共享的
线程:每个应用运行之后就会对应启动一个主线程,通过主线程可以创建多个字线程,各个线程共享主进程的内存空间。
关于线程、进程的解释有一篇有趣而生动的解释(http://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html)

GIL(全局解释器锁)
我们知道多进程(mutilprocess) 和 多线程(threading)的目的是用来被多颗CPU进行访问, 提高程序的执行效率。 但是在python内部存在一种机制(GIL),在多线程 时同一时刻只允许一个线程来访问CPU。
GIL 并不是Python的特性,它是在实现Python解析器(CPython)时所引入的一个概念。就好比C++是一套语言(语法)标准,但是可以用不同的编译器来编译成可执行代码。有名的编译器例如GCC,INTEL C++,Visual C++等。
Python也一样,同样一段代码可以通过CPython,PyPy,Psyco等不同的Python执行环境来执行。像其中的JPython就没有GIL。然而因为CPython是大部分环境下默认的Python执行环境。所以在很多人的概念里CPython就是Python,也就想当然的把 GIL 归结为Python语言的缺陷。所以这里要先明确一点:GIL并不是Python的特性,Python完全可以不依赖于GIL。
GIL原理图

虽然python支持多线程,但是由于GIL的限制,在实际运行时,程序运行后开启多个线程,但在通过GIL后同时也只能有一个线程被CPU执行。

多线程
1)多线程执行方法

import time
from threading import Thread

def do_thread(num):
    print("this is thread %s" % str(num))
    time.sleep(3)

for i in range(5):
    t = Thread(target=do_thread, args=(i,))
    t.start()

以上方法就开启了一个5个线程,target用来定义开启线程后要执行的方法,args为参数

线程的其它方法:

1 setName(), getName()
  setName():   给线程设置一个名字
  getName():   获取线程的名称

import time
from threading import Thread

def do_thread(num):
    print("this is thread %s" % str(num))
    time.sleep(3)

for i in range(2):
    t = Thread(target=do_thread, args=(i,))
    t.start()
    t.setName("Mythread_{0}".format(str(i)))
    print(t.getName())

run result:
    this is thread 0
    Mythread_0
    this is thread 1
    Mythread_1

2 setDaemon()
setDaemon(True/False): 设置创建的子线程为前台线程或后台线程.设置为True则子线程为后台线程。

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值