线程

之前了解了操作系统的发展史,也知道了进程和线程的概念,归纳一下就是:

        进程:本质上就是一段程序的运行过程(抽象的概念)

        线程:最小的执行单元,是进程的实体

        进程:最小的资源单位
 

线程的调用

        在python中,一般通过导入threading模块来调用线程。 threading 模块建立在thread 模块之上。thread模块以低级、原始的方式来处理和控制线程,而threading 模块通过对thread进行二次封装,提供了更方便的api来处理线程,先看一段直接调用的代码:

   直接调用:     

# -*- coding: utf-8 -*-
import threading,time def func1(n):
print('传给我的是%s'%n)
time.sleep(3) def func2():
print('我没有参数的')
time.sleep(5) if __name__ == '__main__':
t1 = threading.Thread(target=func1,args=(5,)) #target传入的是函数名,不带括号,args要以元组形式传入参数
t2 = threading.Thread(target=func2) #没有参数就不用传 t1.start() #运行线程,本质是调用run方法
t2.start()
print('ending......') >>>传给我的是5
>>>我没有参数的
>>>ending......

运行的时候几乎同时打印了三条结果,然后等待约5s再停止,如果是单线程的话就要8s的时间才能运行完,这样做提升了效率。其次这个程序一共有多少线程呢?答案是3个,除了t1和t2两个实例化得到的子线程,还有程序本身的主线程,还记得那句话吗?一个程序至少有一个进程,一个进程至少有一个线程。

继承方式调用线程:

import time
import threading class Mythread(threading.Thread):
def __init__(self,n):
threading.Thread.__init__(self)
self.n = n def func1(self):
print('传给我的是%s'%self.n)
time.sleep(self.n) def run(self): ##定义每个线程要运行的函数
self.func1() if __name__ == '__main__':
t1 = Mythread(2)
t2 = Mythread(5) t1.start()
t2.start() >>>传给我的是2
>>>传给我的是5

也是直接打印两条结果,然后等待5s程序结束。一般这种方式很少用到,都是直接调用比较快。如果不穿参数的话,__init__方法可以不用写,但是run函数一定要写的,至于为什么,你可以通过找继承的父类去推,这里就不啰嗦了。

线程的join方法

     join是线程实例化后也具有的方法,像上边的start一样,那么join有什么作用呢?

import threading
from time import ctime,sleep def music(name): print ("Begin listening to %s. %s" %(name,ctime()))
sleep(2)
print("end listening %s"%ctime()) def moive(title): print ("Begin recording the %s! %s" %(title,ctime()))
sleep(5)
print('end recording %s'%ctime()) threads = [] t1 = threading.Thread(target=ListenMusic,args=('毛不易的歌',))
t2 = threading.Thread(target=RecordBlog,args=('白蛇',)) threads.append(t1)
threads.append(t2) if __name__ == '__main__': for t in threads:
t.start()
#t.join()#串行
# t.join() # t1.join() # t2.join()########分别试一下这几种join位置下的结果
print('endtime is %s'%ctime())

我们逐个分析,不加join时:

Begin listening to 毛不易的歌. Thu Apr 11 17:47:01 2019
Begin recording the 白蛇! Thu Apr 11 17:47:01 2019
endtime is Thu Apr 11 17:47:01 2019
end listening Thu Apr 11 17:47:04 2019
end recording Thu Apr 11 17:47:06 2019

加上一个t1.join时:

Begin listening to 毛不易的歌. Thu Apr 11 17:49:42 2019
Begin recording the 白蛇! Thu Apr 11 17:49:42 2019
end listening Thu Apr 11 17:49:45 2019
endtime is Thu Apr 11 17:49:45 2019
end recording Thu Apr 11 17:49:47 2019

注意endtime的变化,然后去试试其他情况就可以知道(注意for循环里面和外面的t的区别),join作用就是在子线程完成运行之前,这个子线程的父线程将一直被阻塞。

线程的setDaemon方法

      通过join我们可以阻塞线程,那么setDaemon就刚好相反,就是将线程声明为守护线程,但是必须在start() 方法调用之前设置, 如果不设置为守护线程程序会被无限挂起。当我们 在程序运行中,执行一个主线程,如果主线程又创建一个子线程,主线程和子线程 就分兵两路,分别运行,那么当主线程完成想退出时,会检验子线程是否完成。如 果子线程未完成,则主线程会等待子线程完成后再退出。但是有时候我们需要的是 只要主线程完成了,不管子线程是否完成,都要和主线程一起退出,这时就可以 用setDaemon方法啦

import threading
from time import ctime,sleep def music(name): print ("Begin listening to %s. %s" %(name,ctime()))
sleep(2)
print("end listening %s"%ctime()) def moive(title): print ("Begin recording the %s! %s" %(title,ctime()))
sleep(5)
print('end recording %s'%ctime()) threads = [] t1 = threading.Thread(target=ListenMusic,args=('毛不易的歌',))
t2 = threading.Thread(target=RecordBlog,args=('白蛇',)) threads.append(t1)
threads.append(t2) if __name__ == '__main__':
#t1.setDaemon(True)
t2.setDaemon(True)
for t in threads:
#t.setDaemon(True) #一定要在start前
t.start()
#t.join()#串行
# t.join() t1.join() # t2.join()########分别试一下这几种join位置下的结果
print('endtime is %s'%ctime())

看一下结果,白蛇没看完就停了

Begin listening to 毛不易的歌. Thu Apr 11 18:03:42 2019
Begin recording the 白蛇! Thu Apr 11 18:03:42 2019
end listening Thu Apr 11 18:03:45 2019
endtime is Thu Apr 11 18:03:45 2019

其他方法

# run():  线程被cpu调度后自动执行线程对象的run方法
# start():启动线程活动。
# isAlive(): 返回线程是否活动的。
# getName(): 返回线程名。
# setName(): 设置线程名。 threading模块提供的一些方法:
# threading.currentThread(): 返回当前的线程变量。
# threading.enumerate(): 返回一个包含正在运行的线程的list。正在运行指线程启动后、结束前,不包括启动前和终止后的线程。
# threading.activeCount(): 返回正在运行的线程数量,与len(threading.enumerate())有相同的结果。

基本的线程就是这样使用的,后面讲的就是同步和异步的概念,还有各种锁,慢慢来。

 

  

python的进程与线程(二)的更多相关文章

  1. Python创建进程、线程的两种方式

    代码创建进程和线程的两种方式 """ 定心丸:Python创建进程和线程的方式基本都是一致的,包括其中的调用方法等,学会一个 另一个自然也就会了. "" ...

  2. Python的进程与线程--思维导图

    Python的进程与线程--思维导图

  3. python之进程与线程

    什么是操作系统       可能很多人都会说,我们平时装的windows7 windows10都是操作系统,没错,他们都是操作系统.还有没有其他的? 想想我们使用的手机,Google公司的Androi ...

  4. 《Python》进程收尾线程初识

    一.数据共享 from multiprocessing import Manager 把所有实现了数据共享的比较便捷的类都重新又封装了一遍,并且在原有的multiprocessing基础上增加了新的机 ...

  5. Python的进程、线程和threading模块

    (注:本文部分内容摘自互联网,由于作者水平有限,不足之处,还望留言指正.) 怀念在学校念书的时候,我不小心触碰到了错误,老师会说:你错了:而我却总是倔强得以为自己没错.我的内心是不屑的,直到在真理面前 ...

  6. Python基础-进程和线程

    一.进程和线程的概念 首先,引出“多任务”的概念:多任务处理是指用户可以在同一时间内运行多个应用程序,每个应用程序被称作一个任务.Linux.windows就是支持多任务的操作系统,比起单任务系统它的 ...

  7. python的进程与线程

    一.进程与线程的相关概念 1.什么是进程 进程是一个程序在一个数据集上的一次动态执行过程. 进程一般由程序,数据集,进程控制块三部分组成. 2.什么是线程 线程也叫轻量级进程,它是一个基本的CPU执行 ...

  8. Python之进程、线程、协程

    进程和线程的目的 进程和线程目的是为了:提高执行效率 现代操作系统比如Mac OS X,UNIX,Linux,Windows等,都是支持“多任务”的操作系统. 什么叫“多任务“呢?简单地说,就是操作系 ...

  9. python并发编程之线程(二):死锁和递归锁&信号量&定时器&线程queue&事件evevt

    一 死锁现象与递归锁 进程也有死锁与递归锁,在进程那里忘记说了,放到这里一切说了额 所谓死锁: 是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将 ...

随机推荐

  1. Java之增强的for 循环

    3. 增强for循环 1) 作用: 对存储对象的容器进行迭代 2)  jdk5以前怎么迭代 3) 增强for循环迭代数组 String [] arr = {"a", "b ...

  2. 爬虫之scrapy-splash

    什么是splash Splash是一个Javascript渲染服务.它是一个实现了HTTP API的轻量级浏览器,Splash是用Python实现的,同时使用Twisted和QT.Twisted(QT ...

  3. Python Assert 为何不尽如人意

    Python中的断言用起来非常简单,你可以在assert后面跟上任意判断条件,如果断言失败则会抛出异常. >>> assert 1 + 1 == 2 >>> ass ...

  4. 51单片机GPIO口模拟串口通信

    51单片机GPIO口模拟串口通信 标签: bytetimer终端存储 2011-08-03 11:06 6387人阅读 评论(2) 收藏 举报 本文章已收录于:   分类: 深入C语言(20) 作者同 ...

  5. Python 文件读写的三种模式和区别

    #coding=utf-8 #__author:Administrator #__time:2018/5/9 13:14 #__file_name:text1 import io #能调用方法的一定是 ...

  6. 第二天 Java语言基础

    一.如何定义Java中的类 Java代码都定义在类中,类由class来定义,区分public class和class: 二.main方法的作用 main方法是程序的入口:保证程序的独立运行:被JVM调 ...

  7. .net core在网关中统一配置Swagger

    最近在做微服务的时候,由于我们是采用前后端分离来开发的,提供给前端的直接是Swagger,如果Swagger分布在各个API中,前端查看Swagger的时候非常不便,因此,我们试着将Swagger集中 ...

  8. appium--xpath定位元素用法

    一.xpath的使用场景: 自动化测试中经常对元素进行操作时,如果存在id.name.content_desc时,可通过appium框架提供的方法find_element_by_id/name/tag ...

  9. pyqt5实现注册界面并获得文本框内容

    获取框里面的内容,有一个BUG,搞了好久才搞定. __author__ = 'ayew'import sysfrom PyQt5.QtCore import*from PyQt5.QtWidgets ...

  10. java爬虫,爬取当当网数据

     背景:女票快毕业了(没错!我是有女票的!!!),写论文,主题是儿童性教育,查看儿童性教育绘本数据死活找不到,没办法,就去当当网查询下数据,但是数据怎么弄下来呢,首先想到用Python,但是不会!!百 ...