python 多线程 主线程 print 没有执行_Python 线程

线程,有时被称为轻量进程,是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程不拥有私有的系统资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。

线程是程序中一个单一的顺序控制流程。进程内有一个相对独立的、可调度的执行单元,是系统独立调度和分派CPU的基本单位指令运行时的程序的调度单位。在单个程序中同时运行多个线程完成不同的工作,称为多线程。Python多线程用于I/O操作密集型的任务,如SocketServer网络并发,网络爬虫。

现代处理器都是多核的,几核处理器只能同时处理几个线程,多线程执行程序看起来是同时进行,实际上是CPU在多个线程之间快速切换执行,这中间就涉及到上下问切换,所谓的上下文切换就是指一个线程Thread被分配的时间片用完了之后,线程的信息被保存起来,CPU执行另外的线程,再到CPU读取线程Thread的信息并继续执行Thread的过程。

线程模块

Python的标准库提供了两个模块:_thread和threading。_thread 提供了低级别的、原始的线程以及一个简单的互斥锁,它相比于 threading 模块的功能还是比较有限的。Threading模块是_thread模块的替代,在实际的开发中,绝大多数情况下还是使用高级模块threading,因此本书着重介绍threading高级模块的使用。

Python创建Thread对象语法如下:

import threading

threading.Thread(target=None, name=None, args=())

主要参数说明:

target 是函数名字,需要调用的函数。

name 设置线程名字。

args 函数需要的参数,以元祖( tuple)的形式传入

Thread 对象主要方法说明:

run(): 用以表示线程活动的方法。

start():启动线程活动。

join(): 等待至线程中止。

isAlive(): 返回线程是否活动的。

getName(): 返回线程名。

setName(): 设置线程名。

Python中实现多线程有两种方式:函数式创建线程和创建线程类。

第一种创建线程方式:函数式创建线程

创建线程的时候,只需要传入一个执行函数和函数的参数即可完成threading.Thread实例的创建。下面的例子使用Thread类来产生2个子线程,然后启动2个子线程并等待其结束,

import threading

import time,random,math

# idx 循环次数

def printNum(idx):

for num in range(idx ):

#打印当前运行的线程名字

print("{0}\tnum={1}".format(threading.current_thread().getName(), num) )

delay = math.ceil(random.random() * 2)

time.sleep(delay)

if __name__ == '__main__':

th1 = threading.Thread(target=printNum, args=(2,),name="thread1" )

th2 = threading.Thread(target=printNum, args=(3,),name="thread2" )

#启动2个线程

th1.start()

th2.start()

#等待至线程中止

th1.join()

th2.join()

print("{0} 线程结束".format(threading.current_thread().getName()))

运行脚本得到以下结果。

thread1 num=0

thread2 num=0

thread1 num=1

thread2 num=1

thread2 num=2

MainThread 线程结束

运行脚本默认会启动一个线程,把该线程称为主线程,主线程有可以启动新的线程,Python的threading模块有个current_thread()函数,它将返回当前线程的示例。从当前线程的示例可以获得前运行线程名字,核心代码如下。

threading.current_thread().getName()

启动一个线程就是把一个函数和参数传入并创建Thread实例,然后调用start()开始执行

th1 = threading.Thread(target=printNum, args=(2,),name="thread1" )

th1.start()

从返回结果可以看出主线程示例的名字叫MainThread,子线程的名字在创建时指定,本例创建了2个子线程,名字叫thread1和thread2。如果没有给线程起名字,Python就自动给线程命名为Thread-1,Thread-2…等等。在本例中定义了线程函数printNum(),打印idx次记录后退出,每次打印使用time.sleep()让程序休眠一段时间。

第二种创建线程方式:创建线程类

直接创建threading.Thread的子类来创建一个线程对象,实现多线程。通过继承Thread类,并重写Thread类的run()方法,在run()方法中定义具体要执行的任务。在Thread类中,提供了一个start()方法用于启动新进程,线程启动后会自动调用run()方法。

import threading

import time,random,math

class MutliThread(threading.Thread):

def __init__(self, threadName,num):

threading.Thread.__init__(self)

self.name = threadName

self.num = num

def run(self):

for i in range(self.num):

print("{0} i={1}".format(threading.current_thread().getName(), i))

delay = math.ceil(random.random() * 2)

time.sleep(delay)

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值