进程和线程

  • 进程:进程是计算机中程序正在执行的实例,是系统进行资源分配和调度的基本单位。
  • 线程:也被称为轻量级进程,是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针,寄存器集合和堆栈组成。

线程和进程的关系:

现代操作系统中,每一个进程都认为自己独占所有的计算机资源。进程好比一个国家,各个进程间不可以随便的共享数据,而线程就像是省份,同一个进程内的线程可以共享进程的资源,每一个线程拥有自己独立的堆栈。

进程和程序的关系:

程序是源代码编译后的文件,当该程序被操作系统加载到内存中,就是进程,进程中存放着指令和数据,它也是线程的容器。

Python中的线程

1. Thread类

python中线程的开发使用标准库:threading

  1. def __init__(self, group=None, target=None, name=None,
  2. args=(), kwargs=None, *, daemon=None):
  • target:线程调用的对象,即目标函数
  • name: 线程名
  • args:为目标函数传递的实参,元组
  • kwargs:为目标函数关键字传参,字典

2. 线程的启动

  1. import threading
  2. def worker():
  3. print("I'm working")
  4. print("Finished")
  5. t = threading.Thread(target=worker,name='worker') #创建线程对象
  6. t.start() # 启动线程

可以通过threading.Thread创建一个线程对象,target指定目标函数,然后调用start方法进行启动线程。

3. 线程的传参

  1. import threading
  2. import time
  3. def add(x,y):
  4. print("{} + {} = {} 线程ID:{}".format(x,y,x+y,threading.current_thread().ident))
  5. thread1 = threading.Thread(target=add,name='add1',args=(4,5)).start()
  6. time.sleep(1)
  7. thread2 = threading.Thread(target=add,name='add2',args=(10,),kwargs={'y':5}).start()
  8. time.sleep(1)
  9. thread3 = threading.Thread(target=add,name='add3',kwargs={'x':20,'y':5}).start()

线程传参和函数传参没有什么区别,本质上就是函数传参。

4. 线程的属性和方法

threading的属性和方法

名称 含义
current_thread() 返回当前线程对象
main_thread() 返回主线程对象
active_count() 当前处于alive状态的线程数
enumerate() 返回所有活着的线程的列表,不包括已经终止的线程和为开始的线程
get_ident() 返回当前线程的ID

Thread实例的属性和方法

名称 含义
name 名称,仅仅是一个标识。可以通过getName()获取,setName()设置该名称
ident 线程ID
is_alive() 返回线程是否活着
start() 启动线程。每个线程必须且只能执行该方法一次
run() 运行线程函数

start和run的区别:

使用start启动线程,会启动一个新的线程,而使用run方法,并没有启动新的线程,只有在主线程上调用一个普通的函数。

5. daemon线程和non-daemon线程

在Python中,构造线程时,可以设置daemon属性。默认daemon线程是None,即non-daemon线程。

  1. import time
  2. import threading
  3. def foo():
  4. time.sleep(5)
  5. for i in range(20):
  6. print(i)
  7. t = threading.Thread(target=foo,daemon=True) #修改成None
  8. t.start()
  9. print("main thread Exit")

如果一个程序中只有daemon线程,那么主线程退出的时候,会结束所有的daemon线程,退出。

总结:

在一个程序中,如果有non-daemon线程的时候,主线程退出时,不会杀掉所有的daemon线程,直到所有的non-daemon线程全部结束,如果还有daemon线程,主线程退出的时候,会结束所有的daemon线程,然后退出。

6. join方法

  1. import time
  2. import threading
  3. def foo(n):
  4. for i in range(n):
  5. print(i)
  6. time.sleep(1)
  7. t = threading.Thread(target=foo,args=(10,),daemon=True)
  8. t.start()
  9. t.join() # 设置join
  10. print("main thread Exit")

设置join后,daemon线程执行完了,程序才会退出。

join(timeout=None):

一个线程中调用另一个线程的join方法,此时调用者将会被阻塞,直到被调线程终止。一个线程可以被join多次。调用谁的join方法,就要等谁。

  1. import time
  2. import threading
  3. def bar():
  4. while True:
  5. time.sleep(1)
  6. print("bar")
  7. def foo():
  8. print("t1's daemon = {}".format(threading.current_thread().isDaemon()))
  9. t2 = threading.Thread(target=bar)
  10. t2.start()
  11. print("t2's daemon = {}".format(t2.isDaemon()))
  12. t1 = threading.Thread(target=foo,daemon=True)
  13. t1.start()
  14. time.sleep(3)
  15. print("main thread exiting")

只要主程序退出,2个工作线程就结束。

  1. import time
  2. import threading
  3. def bar():
  4. while True:
  5. time.sleep(1)
  6. print("bar")
  7. def foo():
  8. print("t1's daemon = {}".format(threading.current_thread().isDaemon()))
  9. t2 = threading.Thread(target=bar)
  10. t2.start()
  11. print("t2's daemon = {}".format(t2.isDaemon()))
  12. t2.join()
  13. t1 = threading.Thread(target=foo,daemon=True)
  14. t1.start()
  15. t1.join()
  16. time.sleep(3)
  17. print("main thread exiting")

通过相互调用join方法,使线程结束不了。

7. 定时器Timer

  1. class Timer(Thread):
  2. def __init__(self, interval, function, args=None, kwargs=None):

threading.Timer继承自Thread,该类用来定义多久执行一个函数。

start方法执行之后,Timer对象就会处于等待状态,等待了interval之后,开始执行function函数,如果在执行函数之前的等待阶段,使用了cancel方法,就会跳过执行函数。

但是如果线程中的函数已经开始执行,cancel就没有效果了。

  1. import threading
  2. import logging
  3. import time
  4. FORMAT = '%(asctime)s %(threadName)s %(thread)d %(message)s'
  5. logging.basicConfig(format=FORMAT,level=logging.INFO)
  6. def worker():
  7. logging.info('in worker')
  8. time.sleep(2)
  9. t = threading.Timer(5,worker)
  10. t.setName('w1')
  11. t.cancel() # 提前取消
  12. t.start()
  13. print(threading.enumerate())
  14. time.sleep(8)
  15. print(threading.enumerate())

python中线程和进程(一)的更多相关文章

  1. 操作系统/应用程序、操作中的“并发”、线程和进程,python中线程和进程(GIL锁),python线程编写+锁

    并发编程前言: 1.网络应用 1)爬虫 直接应用并发编程: 2)网络框架 django flask tornado 源码-并发编程 3)socketserver 源码-并发编程 2.运维领域 1)自动 ...

  2. python中线程和进程的简单了解

    python中线程和进程的简单了解   一.操作系统.应用程序 1.硬件:硬盘.cpu.主板.显卡........ 2.装系统(本身也是一个软件): 系统就是一个由程序员写出来的软件,该软件用于控制计 ...

  3. Python 中线程和进程

    目录 线程和进程 一. 什么是进程 / 线程 1. 引论 2. 线程 3. 进程 4. 区别 5. 使用 二. 多线程使用 1. 常用方法 2. 常用参数 3. 多线程的应用 3.1 重写线程法 3. ...

  4. python中线程和进程(二)

    目录 线程同步 Event Lock RLock Condition Barrier semaphore GIL 线程同步 线程同步,即线程之间协同工作,一个线程访问某些数据时,其他线程不能访问这些数 ...

  5. python中线程、进程和协程的区别

    进程是资源分配的单位 线程是操作系统调度的单位 协程,又称微线程,纤程,协程的切换只是单纯的操作CPU的上下文,资源很小,效率高 进程切换需要的资源很最大,效率很低 一个程序至少有一个进程,一个进程至 ...

  6. Python之线程、进程和协程

    python之线程.进程和协程 目录: 引言 一.线程 1.1 普通的多线程 1.2 自定义线程类 1.3 线程锁 1.3.1 未使用锁 1.3.2 普通锁Lock和RLock 1.3.3 信号量(S ...

  7. Python之线程与进程

    今天我们来了解一下Python的线程和进程的管理机制 首先,我们要了解下线程跟进程的概念: 线程(Thread)是操作系统能够进行运算调度的最小的单位,是一堆cpu的指令.他被包含在进程中,是进程中的 ...

  8. Python自动化 【第九篇】:Python基础-线程、进程及python GIL全局解释器锁

    本节内容: 进程与线程区别 线程 a)  语法 b)  join c)  线程锁之Lock\Rlock\信号量 d)  将线程变为守护进程 e)  Event事件 f)   queue队列 g)  生 ...

  9. python的线程和进程

    1.线程的基本概念 概念 线程是进程中执行运算的最小单位,是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其它线程 ...

随机推荐

  1. ThinkPHP5零基础搭建CMS系统(一)

    了解学习thinkphp5应该是2016年年底的事情,当时还没有接触过thinkphp3版本,觉得通过手册直接上手学习tp5蛮轻松的,现在从零记录下,搭建可扩展的CMS. 1.ThinkPHP环境搭建 ...

  2. 用js实现算法:冒泡排序、插入排序和快速排序

    一.冒泡排序 function bubbleSort(arr){ for(var i=0;i<arr.length;i++){ for(var j=0;j<arr.length-i-1;j ...

  3. Node笔记一

    什么是javascript? --脚本语言 --运行在浏览器中 --一般用来做客户端页面的交互 javascript运行环境 --运行在浏览器内核中的JS引擎 浏览器这种javascript可以做什么 ...

  4. log4j配置及使用

    一.使用方法: 1.将log4j.properties放到你创建项目的src中 2.引入log4j.jar import org.apache.log4j.*; public class log4jT ...

  5. 基于reflectasm打造自己的通用bean工具

    业务场景: 在很多的业务系统中,erp,crm系统中,有许多的对象信息都是拆开来的,例如一个商品,那可能他的商品名称,商品等主要信息放在一个表(衍生出来一个对象),他的附属信息(商品图片,规格,价格等 ...

  6. 终于解决文件格式问题 unix格式

    关于这个问题,今天终于找到方法  file-setting下 左侧code style  line separator下拉选择unix就可以了 http://www.cnblogs.com/sunfa ...

  7. Java开源生鲜电商平台-订单表的设计(源码可下载)

    Java开源生鲜电商平台-订单表的设计(源码可下载) 场景分析说明: 买家(餐馆)用户,通过APP进行选菜,放入购物车,然后下单,最终支付的流程,我们称为下单过程. 买家可以在张三家买茄子,李四家买萝 ...

  8. Servlet知识点总结

    一, ServletAPI中有4个Java包: 1.javax.servlet:其中包含定义Servlet和Servlet容器之间契约的类和接口 2.javax.servlet.http:其中包含定义 ...

  9. [CVPR 2016] Weakly Supervised Deep Detection Networks论文笔记

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px "Helvetica Neue"; color: #323333 } p. ...

  10. 【阿里聚安全·安全周刊】Python库现后门 可窃取用户SSH信息|Facebook再曝300万用户数据泄露

    本周七个关键词:Python库现后门丨Facebook再曝数据泄露丨加密协议被曝严重漏洞丨英国报摊将出售"色情通行证"丨HTTPS的绿色锁图标丨机器学习和预测应用的API丨Ecli ...