第一章 Python 线程的概念及使用方法

第一章 Python 线程的概念及使用方法,第1张

Python中的进程与线程

第一章 Python 线程的概念及使用方法


目录
  • Python中的进程与线程
  • 第一章 Python 线程的概念及使用方法
    • 一、什么是线程
    • 二、线程的优势
    • 三、Threading 中的Thread 模块创建线程
    • 四、回收线程
    • 五、守护线程与非守护线程


第一章 Python 线程的概念及使用方法 一、什么是线程

一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。

二、线程的优势
  1. 能够在后台处理一些耗时长的程序;
  2. 方便处理需要等待监听的任务,如网络发送与接受数据、文件读取数据等。
三、Threading 中的Thread 模块创建线程

python中的多线程主要调用threading库中的Thread类来实现。

import threading
import time

def Hello(name):
    print('Hello,', name)
    time.sleep(2)	#等待2s
    print('Goodbye',name)
def Hi(name):
    print('Hi,', name)
    time.sleep(5)	#等待5s
    print('Goodbye',name)
'''
	Thread(target,args,kwargs)
		target-绑定线程函数
		args 元组 给线程函数位置传参,注意,格式必须是元组且在最后一个参数后面要跟上一个逗号
		kwargs 字典 给线程函数键值传参
'''
p1 = threading.Thread(target=Hello, args=('CSDN',))  # p1是Thread的一个实例化对象
p2 = threading.Thread(target=Hi, args=('GitHub',))  # p2是Thread的另一个实例化对象
# 执行上面两个子线程
p1.start()
p2.start()
time.sleep(1)	#等待1s
print("主线程的输出在此")

运行上面的程序可以发现,主线程的print()并没有等待p1和p2两个子线程运行完毕,主线程和p1,p2两个子线程是同时进行的,主进程在等待1s后就直接输出print()的内容。但在整个程序中,主进程要等待所有非守护子线程结束之后,主线程才会退出——Process finished with exit code 0。

那么如何实现在子线程结束以后再开始调用主线程的print呢?这里就用到了回收线程的概念。

四、回收线程

主要使用p1.join([timeout])语句,代码如下:

import threading
import time

def Hello(name):
    print('Hello,', name)
    time.sleep(2)	#等待2s
    print('Goodbye',name)
def Hi(name):
    print('Hi,', name)
    time.sleep(5)	#等待5s
    print('Goodbye',name)
'''
	Thread(target,args,kwargs)
		target-绑定线程函数
		args 元组 给线程函数位置传参,注意,格式必须是元组且在最后一个参数后面要跟上一个逗号
		kwargs 字典 给线程函数键值传参
'''
p1 = threading.Thread(target=Hello, args=('CSDN',))  # p1是Thread的一个实例化对象
p2 = threading.Thread(target=Hi, args=('GitHub',))  # p2是Thread的另一个实例化对象
# 执行上面两个子线程
p1.start()
p2.start()
#回收两个子线程
p1.join()
p2.join()
time.sleep(1)	#等待1s
print("主线程的输出在此")

可以看到,在加入join()语句以后,非守护线程结束以后才会进行后续主线程的相关 *** 作。那么,什么是非守护线程呢?

五、守护线程与非守护线程

一般的子线程默认为非守护线程。但有时候我们的线程需要一直启动着,直到主线程退出以后,子线程也一并退出,这类子线程便是守护线程。当主线程结束以后,不管守护线程有没有运行完,都会跟随主线程一并退出,守护主线程。

import threading
import time

def Hello(name):
    print('Hello,', name)
    time.sleep(2)  #等待2s
    print('Goodbye',name)
def Hi(name):
    print('Hi,', name)
    time.sleep(5)  #等待3s
    print('Goodbye',name)
'''
   Thread(target,args,kwargs)
      target-绑定线程函数
      args 元组 给线程函数位置传参,注意,格式必须是元组且在最后一个参数后面要跟上一个逗号
      kwargs 字典 给线程函数键值传参
'''
p1 = threading.Thread(target=Hello, args=('CSDN',))  # p1是Thread的一个实例化对象
p2 = threading.Thread(target=Hi, args=('GitHub',))  # p2是Thread的另一个实例化对象
#设置p2子线程为守护线程
p2.setDaemon(True)
# 执行上面两个子线程
p1.start()
p2.start()

time.sleep(1)  #等待1s
print("主线程的输出在此")

结果可以看出来,p2为守护线程,主线程和p1、p2线程同时开始执行,当p1执行完以后,主线程结束退出,p2作为守护线程也同时退出,没有输出“Goodbye,GitHub”。

上述多线程方法实现的时间性能提速是因为CPU的并发执行,但在Python中这并不是并行执行,而是CPU在线程切换之间实现的(叫做通道技术),之所以不能像JAVA一样实现多线程并行,是因为受到了全局解释器锁(Global Interpreter Lock,GIL)的影响——不管有多少个CPU,在同一时间内,python解释器只能运行一个线程的代码。

因此,将使用多进程来实现并行。这将在下一章中提及。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/869664.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-13
下一篇 2022-05-13

发表评论

登录后才能评论

评论列表(0条)

保存