call线程起名字_Python中多线程Threading模块详解

本文详细介绍了Python的Threading模块,通过多个案例展示了多线程的核心用法、线程锁的应用,包括线程锁、join()方法、信号Semaphore、事件Event、条件Condition及定时器的使用。还探讨了线程池Threadingpool的基本概念,强调了合理使用线程以避免资源浪费的重要性。
摘要由CSDN通过智能技术生成

目的

操作系统运算调度的最小单位就是线程。它被包含在进程之中,是进程中的实际运作单位。线程指的是进程中单一顺序的控制流,一个进程中可以并发多个线程,每个线程并行执行不同的任务,多线程就是一个进程中的多个线程。如果使用线程默认只开启一个主线程,如要开启多线程,需引入Threading模块,并编程才可实现业务需求,本文通过一个个案例来由简入深详细的介绍多线程。

c7fff942cff78d3792a0a7eb5d1128be.png

Python Threading多线程

多线程科普

Python 在设计之初就考虑到要在解释器的主循环中同时只有一个线程在执行,所以在任意时刻,有且只会有一个线程在解释器中运行。为了实现这个设计,Python就加入了全局解释器锁(GIL)来控制,正是这个锁的存在才能保证同一时刻只会有一个线程在运行,所以多线程也因为这个锁的存在,实际上是伪多任务执行,实际是串行执行的。Python的多线程共享主进程的资源,所以可能还会改变其中的变量,这个时候就要加上线程锁,每次执行完一个线程后才能再执行下一个线程。因每次只能有一个线程运行,那多线程怎么实现的呢?Python解释器中一个线程做完了任务然后做IO(文件读写)操作的时候,这个线程就退出,然后下一个线程开始运行,周而复始,循环之。根据多线程机制特性,常用在那些需要等待然后执行的应用程序上(如爬虫读),也就是说多线程适用于IO密集型的任务量(像:文件存储,网络通信之类)。注意:定义多线程,传递参数时,如只有一个参数用args=(i,)一定要加上逗号,是一个参数列表。
bbabfc824388e58fd224036053951255.png

python多线程科普

案例一:多线程核心用法

先来看下核心用法,感受下

import sysimport threadingimport timereload(sys)sys.setdefaultencoding('utf-8')def loop():    #定义一个要循环的函数,当然后面肯定会定义好几个函数    print 'thread %s is running...' % threading.current_thread().name    #threading.current_thread().name就是当前线程的名字  在声明线程的时候可以自定义子线程的名字    n = 0    while n < 10:        n = n + 1        print '%s >>> %s' % (threading.current_thread().name, n)        #输出当前线程名字  和循环的参数n    print 'thread %s ended.' % threading.current_thread().nameprint 'thread %s is running...' % threading.current_thread().name#下面的一部分就是threading的核心用法#包括target name args 之类的 一般我只用targer=你定义的函数名t = threading.Thread(target=loop, name='线程名:')# 在这里就申明了这个线程的名字t.start()#开始t.join()#关于join的相关信息我会在后面的代码详说print 'thread %s ended.' % threading.current_thread().name

运行结果:

thread MainThread is running...thread 线程名: is running...线程名: >>> 1线程名: >>> 2线程名: >>> 3线程名: >>> 4线程名: >>> 5线程名: >>> 6线程名: >>> 7线程名: >>> 8线程名: >>> 9线程名: >>> 10thread 线程名: ended.thread MainThread ended.

案例二:线程锁

多线程是共享资源的,例如:内存,所以存在其中的变量如果发生了改变的话就会改变后边的变量,导致异常,这个时候可以加上线程锁。线程锁的概念就是主要这个线程运行完后再运行下一个线程。GPL就是个线程锁。

import sysimport threadingimport timereload(sys)sys.setdefaultencoding('utf-8')def loop():    l.acquire()    # 这里相当于把线程加了锁,目前只允许这一个线程运行    print 'thread %s is running...' % threading.current_thread().name    #threading.current_thread().name就是当前线程的名字  在声明线程的时候可以自定义子线程的名字    n = 0    while n < 10:        n = n + 1        print '%s >>> %s' % (threading.current_thread().name, n)        #输出当前线程名字  和循环的参数n    print 'thread %s ended.' % threading.current_thread().name    l.release()    # 这里是把线程锁解开,可以再运行写一个线程print 'thread %s is running...' % threading.current_thread().name#下面的一部分就是threading的核心用法#包括target name args 之类的 一般我只用targer=你定义的函数名t = threading.Thread(target=loop, name='线程名:')l = threading.Lock()# 这里申明一个线程锁t.start()#开始
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值