Python的进程和线程是使用的操作系统的原生线程和进程,其是去调用操作系统的相应接口实现

进程:之间不可直接共享数据,是资源的集合,进程必须有一个线程

线程:基于进程,之间可直接共享数据,可执行,只有所有的线程执行完毕程序才会退出

守护线程:生命值依赖于创建它的主线程,主程序亡,不管守护进程执行到何步也必须立即亡

多线程:不适用与CPU操作任务大的(如计算等),较适合于IO操作任务大的(如文件读写等)

线程实现

简单的线程:

 import threading
#线程实现方法,取名任意
def run11(varx):
print("run11",varx)
#创建线程1
t1=threading.Thread(target=run11,args=("var1111",))
t1.start()
#创建线程2
t2=threading.Thread(target=run11,args=("var2222",))
t2.start()
类方法实现线程:
 import threading
class DongThreadx(threading.Thread):
#构造方法,可以忽略不写
def __init__(self,varx):
#调用父类的构造方法
super(DongThreadx,self).__init__()
self.threadvar=varx #run方法名不能更改
def run(self):
print("类线程:",self.threadvar)
#创建两个线程
t1=DongThreadx("dongxiaodong11")
t1.start()
t2=DongThreadx("dognxiaodong22")
t2.start()

守护线程实现:

t2=threading.Thread(target=run11,args=("var2222",))
t2.setDaemon(True) #使其成为主线程守护线程
t2.start()

线程补充

其他方法:

print(threading.current_thread()) #当前所属的线程
print(threading.active_count()) #当前活跃的总线程数
t1.join() #等待线程 t1 执行完毕

等待子线程执行完毕:

方法一:

使用join

 import threading
import time
num=0 #延时并自增1
def run11():
global num
time.sleep(2)
num+=1 #生成1000个线程
listthreadx=[]
for i in range(10000):
#创建线程
t1=threading.Thread(target=run11,args=())
listthreadx.append(t1)
t1.start() #等待1000个线程执行完毕,并输出结果
for t in listthreadx:
t.join() print("总数为:",num)

方法二:

如果使用【threading.active_count()】的值为1,也说明子线程执行完毕

while threading.active_count() !=1:
pass
print("总数为:",num)

线程锁:

在多个线程中修改同一个数据时,可能会出现数据修改不正确,其是因为多核CPU和多线程造成的,在Python3中已经优化了此类错误,Python2可以使用线程锁进行优化:

 lockx=threading.Lock() #得到锁实例
#延时并自增1
def run11():
lockx.acquire() #获取线程锁
global num
num+=1
lockx.release() #释放线程锁

递归锁

【lockx=threading.RLock()】,实现锁和钥匙的一一对应,如果程序有内外嵌套锁时,可以使用其优化

信号量:

规定同时执行的最大线程数

 blockx=threading.BoundedSemaphore(10) # 表示10为最大同时启动线程数
#延时并自增1
def run11():
blockx.acquire() #获取线程锁
global num
num+=1
blockx.release() #释放线程锁

标志位:

在线程中封装了bool,实现了基本的标志位功能,其主要方法有:

eventx=threading.Event() #得到event实例

eventx.set() #设置标志位

eventx.wait()#等待标志位设置,一直处于阻塞

eventx.clear() #清除标志位

 import threading
import time eventx=threading.Event() #得到event实例 def run11():
print("-----开始,等待标志位----")
eventx.wait()#等待标志位设置,一直处于阻塞
print("---阻塞取消,执行完成------")
eventx.clear() #清除标志位 def run22(times):
time.sleep(times)
eventx.set() #设置标志位 #执行线程
t1=threading.Thread(target=run11,args=())
t1.start() #延时线程
t2=threading.Thread(target=run22,args=(3,))
t2.start()

Python档案袋(线程 )的更多相关文章

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

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

  2. python/进程线程的总结

    python/进程线程的总结 一.进程和线程的描述: 进程:最小的资源管理单位 线程:最小的执行单位 执行一个进程时就默认执行一个线程(主线程) 进程和线程的工作方式: 串行: 假如共有A.B.C任务 ...

  3. 在python中单线程,多线程,多进程对CPU的利用率实测以及GIL原理分析

    首先关于在python中单线程,多线程,多进程对cpu的利用率实测如下: 单线程,多线程,多进程测试代码使用死循环. 1)单线程: 2)多线程: 3)多进程: 查看cpu使用效率: 开始观察分别执行时 ...

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

    目录 进程和线程 Python中的线程 1. Thread类 2. 线程的启动 3. 线程的传参 4. 线程的属性和方法 5. daemon线程和non-daemon线程 6. join方法 7. 定 ...

  5. 一文了解Python的线程

    问题 什么是线程? 如何创建.执行线程? 如何使用线程池ThreadPoolExecutor? 如何避免资源竞争问题? 如何使用Python中线程模块threading提供的常用工具? 目录 1. 什 ...

  6. <python的线程与threading模块>

    <python的线程与threading模块> 一 线程的两种调用方式 threading 模块建立在thread 模块之上.thread模块以低级.原始的方式来处理和控制线程,而thre ...

  7. Python之线程 2 - Python实现线程

    一 python与线程 1.全局解释器锁GIL(用一下threading模块之后再来看~~) 2.python线程模块的选择 二 Threading模块 1.线程创建 2.多线程与多进程 3.多线程实 ...

  8. python之线程相关操作

    1.线程: 一个进程可以有多个线程,共享一个进程的资源: 2.进程线程的区别:  进程是资源分配的最小单位,线程是程序执行的最小单位 3.python中线程模块threading, 提供的类: Thr ...

  9. Python:线程之定位与销毁

    背景 开工前我就觉得有什么不太对劲,感觉要背锅.这可不,上班第三天就捅锅了. 我们有个了不起的后台程序,可以动态加载模块,并以线程方式运行,通过这种形式实现插件的功能.而模块更新时候,后台程序自身不会 ...

  10. {Python之线程} 一 背景知识 二 线程与进程的关系 三 线程的特点 四 线程的实际应用场景 五 内存中的线程 六 用户级线程和内核级线程(了解) 七 python与线程 八 Threading模块 九 锁 十 信号量 十一 事件Event 十二 条件Condition(了解) 十三 定时器

    Python之线程 线程 本节目录 一 背景知识 二 线程与进程的关系 三 线程的特点 四 线程的实际应用场景 五 内存中的线程 六 用户级线程和内核级线程(了解) 七 python与线程 八 Thr ...

随机推荐

  1. Nginx 静态页面POST 请求提示405 Not Allowed

    从git上cp了一个开源的前端框架lay Ajax版本,用Nginx配置访问首页没问题 nginx配置如下: server { listen ; server_name adminhtml.com; ...

  2. Python @property 详解

    本文讲解了 Python 的 property 特性,即一种符合 Python 哲学地设置 getter 和 setter 的方式. Python 有一个概念叫做 property,它能让你在 Pyt ...

  3. 今天分享三种方法实现Linux系统调用,感兴趣的朋友可以参考一下

    系统调用(System Call)是操作系统为在用户态运行的进程与硬件设备(如CPU.磁盘.打印机等)进行交互提供的一组接口.当用户进程需要发生系统调用时,CPU 通过软中断切换到内核态开始执行内核系 ...

  4. CheckedTextView文字不居中的问题

    问题:CheckedTextView设置了android:gravity="center",但是不居中 解决方法:添加属性android:textAlignment="c ...

  5. 通过excel获取一串连续的数字

    输入一个格式的数字 点击按住右下角 拖动即可

  6. python学习笔记(4)

    .................................................................................................... ...

  7. ef.core Mysql

    Entity层 using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; ...

  8. SVN 问题:None of the environment variables SVN_EDITOR, VISUAL or EDITOR are set, and no 'editor-cmd' run-time

    问题原因: 没有设置svn编辑器的环境变量,主要是import.commit中填写comment要用 解决办法: 编辑 /etc/bashrc 文件,加入如下一行: export SVN_EDITOR ...

  9. mysql_Navicat数据库破解

    Navicat Premium 12.1.16.0安装与激活 Navicat Premium 12是一套数据库开发管理工具,支持连接 MySQL.Oracle等多种数据库,可以快速轻松地创建.管理和维 ...

  10. SPP-Net理解

    文章没有看完,先挑几个点谈一下. 1. 动机 在上一篇文章的末尾提到,RCNN做了很多重复计算,SPP就是为了解决这个问题而提出的的一个方法----空间金字塔池化. 感觉这个问题本质上还是全连接层对r ...