11.python并发入门(part2 threading模块的基本使用)

简介:

一、在使用python多线程之前,你需要知道的。

python的多线程中,实现并发是没有问题的,但是!!是无法实现真正的并行的。

这是因为python内部有个GIL锁(全局解释器锁),这个锁限制了在同一时刻,同一个进程中,只能有一个线程被运行!!!


二、threading模块的基本使用方法。

可以使用它来创建线程。有两种方式来创建线程。

1、通过继承Thread类,重写它的run方法。

2、创建一个threading.Thread对象,在它的初始化函数__init__中将可调用对象作为参数传入。


3、接下来演示下这两种创建线程对象的方法。

  1. 通过继承Thread类的方式创建线程。

#!/usr/local/bin/python2.7

# -*- coding:utf-8 -*-

import threading

import  time

class Mythread(threading.Thread):

    def __init__(self,num):

        threading.Thread.__init__(self)

        self.num = num

    def run(self):

        print "running number %s" %(self.num)

        time.sleep(3)

t1 = Mythread(1111111)

t2 = Mythread(2222222)

t1.start()    #调用线程对象的start方法,类中的run方法就会被执行!!!!

t2.start()

print "ending"


   2.创建一个threading.Thread对象,在实例化对象时调用构造方法来创建线程。

    

import threading

import  time

def print_num(num):

    print "running num is %s" %(num)

    time.sleep(3)

    print "running num is %s over!!!!" %(num)

if __name__ == "__main__":

    t1 = threading.Thread(target=print_num,args=(111111,))  #创建线程对象

    t2 = threading.Thread(target=print_num,args=(222222,)) #创建线程对象。

    t1.start()  #运行线程对象

    t2.start()

    print "ending"


#当前执行的python程序是一个主线程,在程序中执行的两个线程就是子线程。




三、关于线程对象的一些常用方法。

  1. join()执行了线程的join方法后,在子线程运行结束之前,父线程会被一直阻塞。

import threading

import  time

def listen_music(name):

    print "begin listenning to %s.%s" %(name,time.ctime())

    time.sleep(3)

    print "end listenning time %s" %(time.ctime())

def play_game(name):

    print "play %s time %s " %(name,time.ctime())

    time.sleep(8)

    print "end playing"

thread_list = []

t1 = threading.Thread(target=listen_music,args=("mirrorcle world",))

t2 = threading.Thread(target=play_game,args=("Virtual stalker",))

t1.start()

t1.join()   #当t1没有执行完之前,父线程会被阻塞,直到t1执行结束后,主线程(主程序)的代码才会继续执行。

t2.start()

t2.join()  #当t2没有执行完之前,父线程会被阻塞,直到t2执行结束后主线程(主程序)的代码才会继续执行。

print "ending......."


   2.setdeamon()设置守护线程。

首先先来了解下守护线程的概念。

我们用python写的程序,在运行的过程中,会开启一个主线程,如果这个主线程开启了一个子线程,主线程和子线程会兵分两路,分别运行。

默认情况下,当我们的python程序运行结束,准备退出的时候,会校验子线程是否运行完毕,如果子线程没有运行完毕,主线程会等待子线程运行完毕后,在退出,这是默认情况。

假如,我们现在有一种需求,只需要主线程运行结束后,不管子线程是否运行结束,都要和主线程一起结束,这就是守护线程的概念。

import threading

import  time

def listen_music(name):

    print "begin listenning to %s.%s" %(name,time.ctime())

    time.sleep(3)

    print "end listenning time %s" %(time.ctime())

def play_game(name):

    print "play %s time %s " %(name,time.ctime())

    time.sleep(8)

    print "end playing"

thread_list = []

t1 = threading.Thread(target=listen_music,args=("mirrorcle world",))

t2 = threading.Thread(target=play_game,args=("Virtual stalker",))

t1.setDaemon(True)  #守护线程一定要设置在start之前!!!

t1.start()

t2.setDaemon(True)

t2.start()

print "ending......."


运行结果:

begin listenning to mirrorcle world.Thu May 11 10:26:23 2017

play Virtual stalker time Thu May 11 10:26:23 2017 

ending.......

从结果中可以看出两个线程的内容并没有被执行完!主线程执行结束后,子线程也跟着结束了!


四、关于线程对象的一些其他方法。

isAlive() 用来判断一个线程是否处于活动状态。

getName() 返回这个线程的线程名称。

setName()设置一个线程的名称。


threading 模块提供的一些函数:

threading.currentThread()返回当前线程对象。

threading.enumerate()  将当前python程序中正在运行的线程对象,以列表的形式返回。

threading.activeCount() 返回当前运行的线程数量。



      本文转自苏浩智 51CTO博客,原文链接:http://blog.51cto.com/suhaozhi/1924811,如需转载请自行联系原作者





相关文章
|
1天前
|
测试技术 Python
Python 有趣的模块之pynupt——通过pynput控制鼠标和键盘
Python 有趣的模块之pynupt——通过pynput控制鼠标和键盘
|
1天前
|
机器学习/深度学习 数据可视化 数据挖掘
《Python 简易速速上手小册》第9章:数据科学和机器学习入门(2024 最新版)
《Python 简易速速上手小册》第9章:数据科学和机器学习入门(2024 最新版)
12 1
|
1天前
|
Serverless 开发者 Python
《Python 简易速速上手小册》第3章:Python 的函数和模块(2024 最新版)
《Python 简易速速上手小册》第3章:Python 的函数和模块(2024 最新版)
32 1
|
1天前
|
人工智能 数据挖掘 程序员
《Python 简易速速上手小册》第1章:Python 编程入门(2024 最新版)
《Python 简易速速上手小册》第1章:Python 编程入门(2024 最新版)
28 0
|
2天前
|
机器学习/深度学习 数据采集 算法
scikit-learn入门指南:从基础到实践
【4月更文挑战第17天】这篇指南介绍了scikit-learn,一个Python数据分析和机器学习的重要库。内容涵盖安装、数据加载与预处理、模型训练(如KNN分类器)、评估、调参优化及高级应用,如降维和聚类。通过实例展示了scikit-learn在分类任务中的使用,强调其在数据科学中的重要性。要深入了解,可参考官方文档和实践案例。
|
3天前
|
Python
python学习-函数模块,数据结构,字符串和列表(下)
python学习-函数模块,数据结构,字符串和列表
25 0
|
3天前
|
程序员 索引 Python
06-python数据容器-set(集合)入门基础操作
06-python数据容器-set(集合)入门基础操作
|
5天前
|
Python
python学习14-模块与包
python学习14-模块与包
|
6天前
|
SQL 关系型数据库 数据库
Python中SQLite数据库操作详解:利用sqlite3模块
【4月更文挑战第13天】在Python编程中,SQLite数据库是一个轻量级的关系型数据库管理系统,它包含在一个单一的文件内,不需要一个单独的服务器进程或操作系统级别的配置。由于其简单易用和高效性,SQLite经常作为应用程序的本地数据库解决方案。Python的内置sqlite3模块提供了与SQLite数据库交互的接口,使得在Python中操作SQLite数据库变得非常容易。
|
9天前
|
JavaScript 前端开发 API
游戏开发入门:Python后端与Vue前端的协同工作方式
【4月更文挑战第11天】使用Python后端(Flask或Django)和Vue.js前端开发游戏变得流行,能提高开发效率和可维护性。本文指导如何构建这样的项目,包括设置环境、创建虚拟环境、搭建后端API及前端Vue组件,强调前后端协作和API接口的重要性。这种架构促进团队合作,提升代码质量和游戏体验。