您的位置:首页 > 编程语言 > Python开发

Python学习-并发编程之多线程

2017-08-31 00:00 351 查看

Python学习-并发编程之多线程

threading模块概述

​ 学过Python的人应该都知道,Python是支持多线程的,并且是native的线程。本文主要是通过threading这个模块来实现多线程的,threading模块是对thread模块的二次封装,提供了更方便的API来操作线程 。目前Python对线程的支持还不够完善,不能利用多CPU,所以本文概述的都是进程下的多线程。注意:线程中没有父子关系,一个进程中可以包含N个线程,每个线程之间都是平等关系。

创建线程

​ 一般来说,使用线程有两种模式,一种是创建线程要执行的函数,把这个函数传递进Thread对象里,让它来执行;另一种是直接从Thread继承,创建一个新的class,把线程执行的代码放到这个新的 class里。在这之前我们来介绍一下Thread类吧!

Thread类概述

# 下面只是列举一下常用的属性和方法
class Thread:
'''
group:参数一直为None;
target:参数为线程程要执行的代码,即函数的地址;
name:参数为线程的名称,可以自定义;
args:即以位置传参的方式给线程程要执行的代码传递参数,传参时必须时元组形式;
kwargs:即以关键字传参的方式给线程要执行的代码传递参数;
'''
def __init__(self, group=None, target=None, name=None,
args=(), kwargs=None, *, daemon=None):
pass

def start(self):
'''启动线程,并调用该线程中的run()方法。'''
pass

def run(self):
'''线程启动时运行的方法,正是它去调用target指定的函数。'''
pass

def join(self, timeout=None):
'''主线程等待其它线程执行完毕才继续执行,timeout参数为等待时间。'''
pass

def is_alive(self):
'''如果线程还在运行,返回True。'''
pass

def getName(self):
'''获取线程的名字。'''
pass

def setName(self):
'''更改或设置线程的名字。'''
pass

创建线程(方法一)

# 把要执行的函数地址传给线程对象
import random
from threading import Thread

# 创建一个函数,函数处理,如果一个数 可以整除2就整除,不能整除就*3+1再整除,直到结果为1
def Calculation(value, count):
if value == 1:
print(count)
return
if value % 2 == 0:
count += 1
value = value / 2
else:
value = value * 3 + 1
Calculation(value, count)

# 注意:在windows中Thread()必须放到# if __name__ == '__main__':下
if __name__ == '__main__':
count = 0
# 创建线程程时,所有参数必须按关键子方式传参,且args必须为一个元组,最后一个元素末尾要加“,”
thread_1 = Thread(target=Calculation, args=(random.randint(1, 10), count,))
thread_2 = Thread(target=Calculation, args=(random.randint(1, 10), count,))
# 使用start()开启子进程
thread_1.start()
thread_2.start()

# 使用join()方法阻塞线程,直到线程结束
thread_1.join()
thread_2.join()

print("主!")

创建线程(方法二)

# 创建一个新的类,这个类继承Thread,并将要执行的代码方放到这个新类中
import random
from threading import Thread

class Sub_Thread(Thread):				# 创建一个继承Thread的类
def __init__(self, value, count):
super().__init__()				# 用super()方法调用Thread类的__init__()方法
self.value = value
self.count = count

def run(self):						# 注意:线程类必须有run()方法
self.Calculation(self.value, self.count)	# run()方法中包含需要执行的代码

def Calculation(self, value, count):  # 创建线程需要执行的函数
if value == 1:
print(count)
return
if value % 2 == 0:
count += 1
value = value / 2
else:
value = value * 3 + 1
self.Calculation(value, count)

# 注意:在windows中Thread()必须放到# if __name__ == '__main__':下
if __name__ == '__main__':
count = 0
thread_1 = Sub_Thread(random.randint(1, 10), count)	# 实例化一个线程对象
thread_2 = Sub_Thread(random.randint(1, 10), count)

thread_1.start()		# 开启线程
thread_2.start()
# 使用join()方法阻塞线程,直到线程结束
thread_1.join()
thread_2.join()

print("主!")

Thread类其他属性及方法的应用:

# Thread类的其他属性及方法概述:

# daemon属性
thread_1.daemon = True		# 开启守护进程,即父进程结束后,不管子进程是否运行完都一起结束

# getName()方法
# 获取线程的名称
thread_name = thread_1.getName()

# setName()方法
thread_1.setName('Calculation_1')   # 设置线程的名称

# is_alive()方法
thread_1.is_alive()		# 返回线程的状态,布尔值

# join()方法
thread_1.join(3)			# 等待线程结束,如果线程不结束,程序则不往下执行,等待时间为3秒
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Python 线程 Thread