多线程初级入门学习

多线程

多线程一直都感觉很神秘,一直有一种懂一点,但是又觉得什么都不懂的样子,只是知道它用处多多,灰常厉害,最近在做的几个项目当中由于处理的数据较多,所以也都引入了多线程来执行程序,但是由于多线程以前接触的不是很多,所以在应用方面还是有点小尴尬,总是出现一些各式各样的问题,所以想重新系统的学习一下线程的有关知识点;

线程有5种状态,状态转换的过程如下图所示:

threading

Python通过两个标准库thread和threading提供对线程的支持。thread提供了低级别的、原始的线程以及一个简单的锁。由于thread提供的线程功能不多,无法在主线程结束后继续运行,不提供条件变量等等原因,一般不使用thread模块,这里就不多介绍了,主要介绍一下threading模块

threading 模块提供的常用方法

1> 返回正在运行的线程数量,与len(threading.enumerate())有相同的结果

threading.active_count()
threading.activeCount()

2>返回当前的线程变量

threading.current_thread()
threading.currentThread()

3>返回当前正在运行的线程的列表。正在运行指线程启动后、结束前,不包括启动前和终止后的线程

threading.enumerate()

4>设置threading全局超时时间

threading.TIMEOUT_MAX

threading模块提供的类

Thread, Lock, Rlock, Condition, [Bounded]Semaphore, Event, Timer, local

Thread

是threading模块中最重要的类之一,可以使用它来创建线程,有两种方式来创建线程:

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

import time
import threading
# 通过继承Thread创建类
class newThread(threading.Thread):
    def __init__(self, num):
        threading.Thread.__init__(self)
        self.num = num
    def run(self):
        time.sleep(2)
        print("I am", self.num)
for i in range(10):
    t1 = newThread(i)
    t1.start()

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

import time
import threading

# 使用threading.Thread直接在线程中运行函数
def run(x):
    time.sleep(2)
    print x

for i in range(10):
    t1 = threading.Thread(target=run, args=(i,)) # 直接使用Thread附加函数,args为参数
    t1.start()

Lock

是threading模块中创建线程锁的类,我们创建一个该类对象,在线程函数执行前,“抢占”该锁,执行完成后,“释放”该锁,则我们确保了每次只有一个线程占有该锁。这时候对一个公共的对象进行操作,则不会发生线程不安全的现象了

import threading

#锁的使用
#创建锁
mutex = threading.Lock()
#锁定,果设定了timeout,则在超时后通过返回值可以判断是否得到了锁,从而可以进行一些其他的处理
mutex.acquire([timeout])
#释放
mutex.release()

当然,锁也可以作为上下文管理器使用(with Lock),可以不用重复的获取和释放锁

with threading.Lock():
    pass

Rlock

与Lock类似,这两种琐的主要区别是:RLock允许在同一线程中被多次acquire。而Lock却不允许这种情况(容易产生死锁现象)。注意:如果使用RLock,那么acquire和release必须成对出现,即调用了n次acquire,必须调用n次的release才能真正释放所占用的琐

import threading
lock = threading.Lock() #Lock对象
lock.acquire()
lock.acquire()  #产生了死琐。
lock.release()
lock.release()  

import threading
rLock = threading.RLock()  #RLock对象
rLock.acquire()
rLock.acquire() #在同一线程内,程序不会堵塞。
rLock.release()
rLock.release()  

threading.Event

实现线程间通信

工作中遇到的线程实例

(创建的线程数在一定的范围内):

import time
import threading as th
def f1(i):
    time.sleep(2)
    pass

max_threadings = 10
for i in range(50):
    print ‘当前线程数量‘, len(th.enumerate())
    while True:
        if len(th.enumerate()) < max_threadings:
            try:
                newthread = th.Thread(target=f1, args=(i,))
                break
            except:
                continue
        else:
            pass
    newthread.start()

 

时间: 2024-08-27 07:49:58

多线程初级入门学习的相关文章

AngularJs 初级入门 学习笔记

刚学angular, 做一些笔记方便自己翻看. ng-app: 填写模块的名称 ng-init: 初始化数据(一般通过控制器初始化) ng-model: 填写数据模型 ng-bind: 绑定数据模型, 用于展示数据 ng-controller: 控制器, 用于存储数据,改变数据等 ng-disabled: 绑定应用程序数据到 HTML 的 disabled 属性 ng-show(ng-hide): 通过数据的true或false来控制 DOM 元素显示或隐藏 ng-事件名: 绑定HTML的对应事

java多线程入门学习(一)

java多线程入门学习(一) 一.java多线程之前 进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1--n个线程.     线程:同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换开销小.     线程和进程一样分为五个阶段:创建.就绪.运行.阻塞.终止.     多进程是指操作系统能同时运行多个任务(程序).     多线程是指在同一程序中有多个顺序流在执行. 在java中要想实现多线程,有两种手段,一种是继承T

2019Python开发学习路线(初级入门)

Python虽然是脚本语言,但是因为容易学,迅速成为科学家的工具,从而积累了大量的工具库.架构,人工智能涉及大量的数据计算,用Python是很自然的,简单高效.因此Python大受欢迎,2019Python开发学习路线(初级入门)免费送给大家:Python允许你分割你的程序模块,可以重复使用在其他Python程序上.它配备了一个标准的模块,你可以使用你的程序的基础 - 或作为例子开始学习Python编程的大集合.这些模块提供了一些事情,如文件I / O,系统调用,插座,甚至像Tk图形用户界面接口

微信小程序入门学习

前(che)言(dan): 近几天,微信小程序的内测引起了众多开发人员的热议,很多人都认为这将会成为一大热门,那么好吧,虽然我是一个小白,但这是个新玩意,花点时间稍稍钻研一下也是无妨的,谁让我没有女朋友呢,给我提供了大量的闲暇时光,对此我只想说:呵呵!.现在微信小程序刚发布还在测试阶段,可以说是1.0版本,所以框架和结构内容都还不多,这时候不学什么时候学?万一成为大牛了呢?万一有哪个妹子看上我了呢?想想还有点小激动呢... 正文: 1.什么是微信小程序? 简单的说很像 H5,它将 应用(功能与a

关于黑客,你了解多少?----黑客入门学习(常用术语+DOS操作)

关于黑客,你了解多少?----黑客入门学习(常用术语+DOS操作) ·1.1·前言 黑客一次是由英语"Hacker"英译出来的,是指专门研究.发现计算机和网络漏洞的计算机爱好者,他们伴随着计算机和网络的发展而产生成长.黑客对计算机有着狂热的兴趣和执着的追求,他们不断的研究计算机和网络知识,发现计算机和网络中存在的漏洞,喜欢挑战高难度的网络系统并从中找到漏洞,然后向管理员提出解决和修补漏洞的方法. 黑客的出现推动了计算机和网络的发展与完善.他们所做的不是恶意破坏,他们是一群纵横于网络的大

Activit最入门学习文档,从如何创建项目开始共20章,看完,任何Java项目集成无压力

Activit流程引擎 本人水平,刚自学java一个多月,然后看视频做的笔记,全部傻瓜式截图教程,反正我学习之前没在网上搜索到任何小白教程, Activit官方的教程真心看不懂,因为都是文字 没具体创建步奏,所以对新手来说很无奈, 然后吧,就把自己的学习经验贡献出来啦 最小白的文档,看完之后,集成到任何java项目中都无压力,我最后的是做了个Jfinal集成,估计这是网上搜到最全的容易懂的入门学习文档,本人自学java一个月,反正我看官方例子什么的都看不懂,然后各搜素也没收到教程视频,还好有别人

怎么入门学习嵌入式

嵌入式系统是一种专用的计算机系统,作为装置或设备的一部分.通常,嵌入式系统是一个控制程序存储在ROM中的嵌入式处理器控制板.事实上,所有带有数字接口的设备,如手表.微波炉.录像机.汽车等,都使用嵌入式系统,有些嵌入式系统还包含操作系统,但大多数嵌入式系统都是由单个程序实现整个控制逻辑. 嵌入式就业发展空间相对较大.嵌入式系统是当前最热门.最具发展前途的IT应用领域之一.包括手机.数字相机(DC).数字摄像机(DV).U-Disk.机顶盒(Set Top Box).高清电视(HDTV).游戏机.智

入门学习Python必须要知道的知识点

Python被誉为全世界高效的编程语言,同时也被称作是"胶水语言",那它为何能如此受欢迎,下面我们就来说说Python入门学习的必备知识点,也就是它为何能够如此受欢迎的原因. 1.Python适用于哪些应用场景? 这个没有固定答案,很多人都说Python不适合开发GUI的程序,但Python自己的IDE--IDEL和第三方的IDE--Eric就是Python写的. 目前看到的更多的人是拿来写Web,使用如Django.web.py框架,没记错Flask也是. 也有一个情况用的比较多,用

Python入门学习指南--内附学习框架

Python入门学习指南 最近开始整理python的资料,博主建立了一个qq群,希望给大家提供一个交流的同平台: 78486745 ,欢迎大家加入共同交流学习. 对于初学者,入门至关重要,这关系到初学者是从入门到精通还是从入门到放弃.以下是结合Python的学习经验,整理出的一条学习路径,主要有四个阶段 NO.1 新手入门阶段,学习基础知识 总体来讲,找一本靠谱的书,由浅入深,边看边练. 网上的学习教程有很多,多到不知道如何选择.所有教程在基础知识介绍方面都差不多,区别在于讲的是否足够细(例如运