zoukankan      html  css  js  c++  java
  • python ---多线程

    1、进程和线程

    (1)进程是资源的分配和调度的一个独立单元,而线程是CPU调度的基本单元

    (2)同一个进程中可以包括多个线程,并且线程共享整个进程的资源(寄存器、堆栈、上下文),一个进程至少包括一个线程。
    (3)进程的创建调用fork或者vfork,而线程的创建调用pthread_create,进程结束后它拥有的所有线程都将销毁,而线程的结束不会影响同个进程中的其他线程的结束
    (4)线程是轻两级的进程,它的创建和销毁所需要的时间比进程小很多,所有操作系统中的执行功能都是创建线程去完成的
    (5)线程中执行时一般都要进行同步和互斥,因为他们共享同一进程的所有资源
    (6)线程有自己的私有属性TCB,线程id,寄存器、硬件上下文,而进程也有自己的私有属性进程控制块PCB,这些私有属性是不被共享的,用来标示一个进程或一个线程的标志
    进程的几种状态:
    (1)run(运行状态):正在运行的进程或在等待队列中对待的进程,等待的进程只要以得到cpu就可以运行
    (2)Sleep(可中断休眠状态):相当于阻塞或在等待的状态
    (3)D(不可中断休眠状态):在磁盘上的进程
    (4)T(停止状态):这中状态无法直观的看见,因为是进程停止后就释放了资源,所以不会留在linux中
    (5)Z(僵尸状态):子进程先与父进程结束,但父进程没有调用wait或waitpid来回收子进程的资源,所以子进程就成了僵尸进程,如果父进程结束后任然没有回收子进程的资源,那么1号进程将回收
    2、python 调用多线程
    • threading.currentThread(): 返回当前的线程变量。
    • threading.enumerate(): 返回一个包含正在运行的线程的list。正在运行指线程启动后、结束前,不包括启动前和终止后的线程。
    • threading.activeCount(): 返回正在运行的线程数量,与len(threading.enumerate())有相同的结果。

    除了使用方法外,线程模块同样提供了Thread类来处理线程,Thread类提供了以下方法:

    • run(): 用以表示线程活动的方法。
    • start():启动线程活动。
    • join([time]): 等待至线程中止。这阻塞调用线程直至线程的join() 方法被调用中止-正常退出或者抛出未处理的异常-或者是可选的超时发生。
    • isAlive(): 返回线程是否活动的。
    • getName(): 返回线程名。
    • setName(): 设置线程名。
    • setDaemon():设置为后台线程或前台线程(默认)如果是后台线程,主线程执行过程中,后台线程也在执行,主线程执行完毕后,后台线程不论成功与否,均停止;如果是前台线程,主线程执行过程中,前台线程也在执行,主线程执行完毕后,等待前台线程也执行完成后,程序停止。
    # bin python3
    # coding = utf-8
    import threading
    from time import ctime, sleep
    
    
    def getname(x):
        for i in range(2):
            print("name is %s"% x)
            sleep(10)
    def gettitle (y):
        for i in range(2):
            print("title is %s" % y)
            sleep(15)
    
    ##创建了threads数组,创建线程t1,使用threading.Thread()方法,在这个方法中调用getname方法target=getname,args方法对getname进行传参。 把创建好的线程t1装到threads数组中。
    threads = []
    t1 = threading.Thread(target=getname, args=('yaradish',))
    threads.append(t1)
    ## 同样t2也做如此操作
    t2 = threading.Thread(target=gettitle, args=('learn python',))
    threads.append(t2)
    
    ##setDaemon(True)将线程声明为守护线程,必须在start() 方法调用之前设置,如果不设置为守护线程程序会被无限挂起。子线程启动后,父线程也继续执行下去,当父线程执行完最后一条语句print "all over %s" %ctime()后,没有等待子线程,直接就退出了,同时子线程也一同结束。
    if __name__ == '__main__':
        for t in threads:
            t.setDaemon(True)
            t.start()
        t.join()   ##阻塞父进程,等待子进程终止  才能往下执行
        print("over")
  • 相关阅读:
    在Myeclipse中配置tomcat
    tomcat用startup.bat启动时,界面一闪消失
    单向链表的基本操作
    简单排序的对比
    关于string的排序 选择插入排序
    insertsort
    selectsort
    理解函数式编程
    vue中使用$nextTick后任然无法正确计算出元素高度
    使用vuex+vue-i18n方式国际化
  • 原文地址:https://www.cnblogs.com/yaradish/p/10519120.html
Copyright © 2011-2022 走看看