进程和线程

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

线程和进程的关系:

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

进程和程序的关系:

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

Python中的线程

1. Thread类

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

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

2. 线程的启动

import threading

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

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

3. 线程的传参

import threading
import time def add(x,y):
print("{} + {} = {} 线程ID:{}".format(x,y,x+y,threading.current_thread().ident)) thread1 = threading.Thread(target=add,name='add1',args=(4,5)).start()
time.sleep(1)
thread2 = threading.Thread(target=add,name='add2',args=(10,),kwargs={'y':5}).start()
time.sleep(1)
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线程。

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

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

总结:

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

6. join方法

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

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

join(timeout=None):

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

import time
import threading def bar():
while True:
time.sleep(1)
print("bar") def foo():
print("t1's daemon = {}".format(threading.current_thread().isDaemon()))
t2 = threading.Thread(target=bar)
t2.start()
print("t2's daemon = {}".format(t2.isDaemon())) t1 = threading.Thread(target=foo,daemon=True)
t1.start()
time.sleep(3)
print("main thread exiting")

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

import time
import threading def bar():
while True:
time.sleep(1)
print("bar") def foo():
print("t1's daemon = {}".format(threading.current_thread().isDaemon()))
t2 = threading.Thread(target=bar)
t2.start()
print("t2's daemon = {}".format(t2.isDaemon()))
t2.join() t1 = threading.Thread(target=foo,daemon=True)
t1.start()
t1.join()
time.sleep(3) print("main thread exiting")

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

7. 定时器Timer

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

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

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

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

import threading
import logging
import time FORMAT = '%(asctime)s %(threadName)s %(thread)d %(message)s'
logging.basicConfig(format=FORMAT,level=logging.INFO) def worker():
logging.info('in worker')
time.sleep(2) t = threading.Timer(5,worker)
t.setName('w1')
t.cancel() # 提前取消
t.start()
print(threading.enumerate())
time.sleep(8)
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. Docker 三剑客之 Docker Swarm(基于 overlay 组网通信)

    相关文章:Docker 三剑客之 Docker Swarm 这一篇主要是对 Docker Swarm 的完善,增加基于 overlay 组网通信,以便 Docker 容器可以跨主机访问. 不同主机间的 ...

  2. Maven的使用

    在项目中,我们通常会为项目添加多种多样的依赖包(jar包),去网上下载,然后引入到项目中,很是麻烦. 但是用maven后,这一切都将变得简单起来.由于我的MyEclipse已经集成了maven插件,这 ...

  3. kaggle入门项目:Titanic存亡预测(三)数据可视化与统计分析

    ---恢复内容开始--- 原kaggle比赛地址:https://www.kaggle.com/c/titanic 原kernel地址:A Data Science Framework: To Ach ...

  4. memcached command

    http://lzone.de/cheat-sheet/memcached memcached Cheat Sheet Telnet Interface How To Connect Use &quo ...

  5. Nginx 的安装与配置

    一.下载 Linux:CentOS 7.3 64位 Nginx:nginx-1.13.1 安装目录:/usr/local/ wget http://nginx.org/download/nginx-1 ...

  6. CSS学习笔记三:自定义单选框,复选框,开关

    一点一点学习CCS,这次学习了如何自定义单选框,复选框以及开关. 一.单选框 1.先写好body里面的样式,先写几个框 <body> <div class="radio-1 ...

  7. bestcoder round 74 div2

    随便看了一场以前的bestcoder,然后顺便写了一下,都不码的样子 有中文题面,这里就不写题目大意了 T1. 刚开始想复杂了,T1可能是4道题里面想的最久的 我们大概弄一下就可以发现,如果a[i]& ...

  8. Java开源生鲜电商平台-购物车模块的设计与架构(源码可下载)

    ava开源生鲜电商平台-购物车模块的设计与架构(源码可下载) 说明:任何一个电商无论是B2C还是B2B都有一个购物车模块,其中最重要的原因就是客户需要的东西放在一起,形成一个购物清单,确认是否有问题, ...

  9. JSP中的隐含对象

    什么是JSP中隐含对象:容器自动创建,在JSP文件中可以直接使用的对象. 作用:JSP预先创建的这些对象可以简化对HTTP的请求,响应信息的访问. JSP中的隐含对象: 输入输出对象:request. ...

  10. macbook 添加快捷启动服务

    来至 Mac OS X: Launch Terminal from keyboard shortcut os x 上很多功能都可以通过Apple自家的Automator.app创建,且使用此方法可以为 ...