线程(一)------线程入门

本文介绍了线程的基本概念,包括进程与线程的关系,线程的特性,并详细讲解了Python中的线程操作,如join方法用于同步,setDaemon方法设置守护线程。同时,提到了线程的run、start、isAlive等实例方法,以及threading模块提供的currentThread、enumerate和activeCount等工具方法,帮助理解线程的运行与管理。
摘要由CSDN通过智能技术生成

 

1.一个程序至少有一个进程,一个进程至少有一个线程,进程可以理解成线程的容器。

2.进程在执行中拥有独立的内存单元,而多个线程共享内存,从而极大提高了程序的运行xiaol。

3.线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口,顺序执行序列和程序的出口。但是线程不能独立执行,必须依存在应用程序中,由应用程序提供多个现场执行控制。

4.进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。

线程是进程的一个实体,是cpu调度和分配的基本单元,他是比进程更小的能独立运行的基本单位,线程自己基本上不用有系统资源,只拥有一点在运行中必不可少的资源(程序计数器,寄存器和栈),但是他可与同属一个进程的其它线程共享进程所拥有的全部资源。

一个线程可以创建和撤销另一个线程:同一个进程中的多个线程之间可以并发执行

物联你启动多少个线程,你有多少个cpu,Python在执行的时候会淡定的在同一时刻只允许一个线程运行

 

import threading
import time
def Hi(num):
    

    print("hello %d \n"%num)
    time.sleep(2)
    print("%s--- over\n" %num)
if __name__ == "__main__":
    t1 = threading.Thread(target = Hi,args = (10,))
    t1.start()
    t2 = threading.Thread(target = Hi,args = (9,))
    t2.start()
    print("end.....")
    

 

join:

join方法是通过调用线程的wait方法来达到同步的目的的。例如,A线程中调用了B线程的join方法,则相当于A线程调用了B线程的wait方法,在调用了B线程的wait方法后,A线程就会进入阻塞状态

import threading
import time
def Hi(num):
    

    print("hello %d \n"%num)
    time.sleep(3)
    print("%s --stop\n"%num)
def Hello(num):
    

    print("hello %d \n"%num)
    time.sleep(5)
    print("%s --stop\n"%num)
if __name__ == "__main__":
    t1 = threading.Thread(target = Hi,args = (10,))
    t2 = threading.Thread(target = Hello,args = (9,))
    t1.start()
    t1.join() #等t1执行完再往下走,串行
   
    t2.start()
    
    t2.join() #等t2执行完再往下走,串行
    print("end.....")
    

setDaemon:

 将线程声明为守护线程,必须在start()方法调用之前设置,如果不设置为守护线程会被无限挂起。这个方法基本和join相反,当我们在程序运行中,执行一个主线程,如果主线程又创建了一个子线程,主线程和子线程就分兵两路,分别运行,那么当主线程完成想退出时,会检验子线程是否完成。如果子线程未完成,则主线程会等待线程完成后再退出。但是有时候我们需要的是只要主线程完成了,不管子线程是否完成,都要和主线程一起退出,这时就可用setDaemon方法

  

 

import  threading
import  time
def hello(name):
    print("i am %s"%name)
    time.sleep(3)
    print("%s stop thread")


if __name__ == "__main__":
    t1 = threading.Thread(target = hello ,args = ("lian",))
    t2=threading.Thread(target  = hello ,args = ("zong",))
    threads = []
    threads.append(t1)
    threads.append(t2)
    #t1.setDaemon(True)
    for t in threads:
        t.setDaemon(True)  # 守护线程,跟着主线程一起退----- 注意:一定在start之前设置
        t.start()
    print("over-----")
  • 实例方法有:

run:用一表示线程活动的方法

start:启动线程活动

isAlive:返回线程是否活动

getName:返回线程名

setName:设置线程名

  • threading模块提供的一些方法:

threading.currentThread():返回当前线程

threading.enumerate():返回一个包含正在运行的线程的list。正在运行指线程启动后,结束前,不包括启动前和终止后的线程

threading.activeCount():返回正在运行的线程数量,与len(threading.enumerate())有相同效果

import  threading
import  time
def hello(name):
    print("i am %s"%name)
    time.sleep(3)

    print("%s stop thread")

if __name__ == "__main__":
    t1 = threading.Thread(target = hello ,args = ("lian",))
    t2=threading.Thread(target  = hello ,args = ("zong",))
    threads = []
    threads.append(t1)
    threads.append(t2)
    #t1.setDaemon(True)
    for t in threads:
        # t.setDaemon(True)  # 守护线程,跟着主线程一起退----- 注意:一定在start之前设置
        t.start()
        t.setName("lian-"+t.getName())
        print("thread--name:"+t.getName())
        print("thread is alive %s:"%t.isAlive())
        print("thread num is :%s"%threading.active_count())
        print("thread current is :",threading.currentThread())
        print("thread list is :",threading.enumerate())
    while threading.active_count() ==1:
        print("over")

 

  • 自定义线程

类继承threading.Thread,重写run方法

import  threading
import  time


class MyThread(threading.Thread):
    def __init__(self,num):
        threading.Thread.__init__(self)
        self.num = num

    def run(self): #定义每个线程要运行的函数
        print("running on number :%s"%self.num)
        time.sleep(3)

if __name__ == "__main__":
  


    #线程调用的第二种方式:
    t1=MyThread(1)
    t1.start()

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值