文档章节

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

D7
 D7
发布于 2017/08/31 15:40
字数 1084
阅读 16
收藏 0

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秒

© 著作权归作者所有

共有 人打赏支持
D7

D7

粉丝 0
博文 5
码字总数 5326
作品 0
海淀
技术主管
私信 提问
python自动化运维之多线程

1、Python中的多线程 执行一个程序,即在操作系统中开启了一个进程,在某一时刻,一个CPU内核只能进行一个进程的任务,现在的计算机所说的多进程/多任务其实是通过加快CPU的执行速度来实现的...

炫维
2018/06/26
0
0
【Python Web学习路线】干货整理,不谈虚的,让你短时间高效学好它!

无论是大数据、人工智能还是机器学习,Python都是最热门的首选语言。 学好Python,可以从事Python Web工程师、Python数据分析、人工智能专家等岗位。本期专题,分享的主题是“如何成为一枚优...

Eddie_yang
2018/12/24
0
0
《Python分布式计算》 第3章 Python的并行计算 (Distributed Computing with Python)

序言 第1章 并行和分布式计算介绍 第2章 异步编程 第3章 Python的并行计算 第4章 Celery分布式应用 第5章 云平台部署Python 第6章 超级计算机群使用Python 第7章 测试和调试分布式应用 第8章...

seancheney
2017/10/13
0
0
[原]我为什么要学习python

引言:学习python近两年,谈谈我对于python的一点小理解,也从一些方面谈谈自己微薄的想法,也就是我为什么学习python 这里我不讨论python的一些有用的库或者框架,只从语言本身,最小支持的...

长平狐
2012/11/14
140
1
python 高性能编程之协程

用 greenlet 协程处理异步事件 自从 PyCon 2011 协程成为热点话题以来,我一直对此有着浓厚的兴趣。为了异步,我们曾使用多线程编程。然而线程在有着 GIL 的 Python 中带来的性能瓶颈和多线程...

passionfly
2015/05/07
0
0

没有更多内容

加载失败,请刷新页面

加载更多

前嗅ForeSpider教程:采集黄页88

以黄页88为例,采集当前列表页新闻的正文数据: 第一步:新建任务 ①点击左上角“加号”新建任务,如图1: 【图1】 ②在弹窗里填写采集地址,任务名称,如图2: 【图2】 ③点击下一步,选择进...

forespider
13分钟前
1
0
Spring Cloud Alibaba基础教程:Nacos 生产级版本 0.8.0

昨晚Nacos社区发布了第一个生产级版本:0.8.0。由于该版本除了Bug修复之外,还提供了几个生产管理非常重要的特性,所以觉得还是有必要写一篇讲讲这次升级,在后续的文章中也都将以0.8.0版本为...

程序猿DD
21分钟前
1
0
HTML+CSS实现div的高度自适应填满剩余空间的7种方法

如图上下两部分,上面部分适应内容的高度,下面部分填充剩余部分。 当下面内容不够时,在下面部分出现滚动条 有2种情况 1.上面内容的高度适应内容,只有2种方法(flex、quirks+table) 2.上面...

linsk1998
25分钟前
1
0
Oracle学习日志-8(查询结果排序)

要用到的表如下 书上写到,上面的查询结果排序是随机的,再执行几次结果可能不同,但是我执行多次后,查询结果的排序都是如此,是因为oracle的默认处理方式是按照物理储存顺序查询的,而我在...

白话
31分钟前
1
0
Data truncation: Incorrect datetime value: '0000-00-00 00:00:00' for column xxx

1. 错误提示 Data truncation: Incorrect datetime value: '0000-00-00 00:00:00' for column xxx 2. 问题分析 从上面的描述我们可以看出原因是:我们给类型是datetime的xxx字段赋值0000-00......

易冥天
34分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部