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

    进程(process):相当于一个程序要运行时所需的所有资源的集合,相当于一个车间,不工作

                            两个进程之间的数据不共享,完全不独立,互相不能访问。

    线程(thread):一道单一指令的控制流,寄生在进程中,相当于车间中的工人,工作。一个进程至少需要一个线程,这个线程为主线程,一个进程中可以有多个线程。

                           cpu的核数越多,代表可以并发的线程越多

                           一个进程中的不同线程共享数据,多线程在修改同一个数据时,一定要加锁

    ___线程___

      1、threading模块

           声明一个线程t=threading.Thread(target=线程函数名,args=(参数,))

        启动一个线程:t.start()

    1 import threading
    2 def func1(n):      
    3     print('thread:%s'%n)
    4 t=threading.Thread(target=func1,args=(i,))
    5 t.start()

       2、实现多线程并发

               即同时启动多个线程,并发运行

    import threading
    import time
    def func1(n):
        time.sleep(8)       #为了更直观的感受到并发效果~~
        print('thread:%s'%n)
    for i in range(30):           #同时启动30个线程,并发
        t=threading.Thread(target=func1,args=(i,))
        t.start()

       3、线程的其他小方法

              t.getName():取线程名 ,该名称是唯一的

              t.setName('sefjsjfisojgiod') :设置线程名字,如果不设置,系统会自动起名

              threading.active_count() :当前活跃的线程数

              threading.current_thread():当前运行的线程实例

     1 import threading
     2 import time
     3 def run(n):
     4     time.sleep(3)
     5     print('thread',n)
     6     print(threading.current_thread())  #打印当前运行的线程的实例
     7 for i in range(10):
     8     t=threading.Thread(target=run,args=(i,))
     9     t.start()
    10     t.setName('kasjdjakldjalsjdlasjdlsd%s'%i)  #修改线程的名字,默认是Thread-i
    11     print(t.getName())                          #获取线程名,线程名是唯一的
    12 print(threading.active_count())                  #统计活跃的线程数

       4、线程等待

              前面程序运行的时候,都是主线程启动和子线程之后,和子线程一起运行,那么如何实现主线程启动了子线程之后先不运行,等待子线程运行完毕之后(比如有些场景需要主线程拿到子线程的结果)再运行呢?????

             线程等待:t.join()

     1 import threading
     2 import time
     3 
     4 def run(n):
     5     time.sleep(1)
     6     print('thread',n)
     7 t_list=[]
     8 for i in range(10):
     9     t=threading.Thread(target=run,args=(i,))
    10     t.start()
    11     t_list.append(t)          #将启动的线程加入到有个列表中
    12 for t in t_list:
    13     t.join()            #  等待所有线程运行完毕
    14 print('))))))))))))))))))))))))))))))))))))))))')

                注意:如果将t.join()加载t.start()之后,那么就不是并行运行了,变成了串行

      5、守护线程

              前面主线程执行完毕,未执行的子线程仍继续执行,并不受主线程的影响,有些场景主线程完毕之后,子线程变没有意义了,那么如何让主线程执行完毕之后,子线程也停止执行,程序退出呢???  

        场景举例:ftpserver为主线程,一个子线程的功能是断开很久没有活跃的连接,比如半小时这个连接没有活动,就将该链接断开。该子线程是一个独立的线程,如果主线程已经退出了,那么该子线程也没有存在的意义了。    怎么实现该子线程在主线程断开之后也停止运行呢????        将该子线程设置为主线程的守护线程就可以啦~~~

       t.setDaemon()

     1 import threading
     2 import time
     3 def run(n):
     4     time.sleep(1)
     5     print('thread:%s'%n)
     6 for i in range(10):
     7     t=threading.Thread(target=run,args=(1,))
     8     t.setDaemon(True)    #  启动线程之前,将线程设置为守护进程,则主线程结束后,子线程也结束,不会继续执行
     9     t.start()
    10 
    11 print('hahhhahahahaha')
  • 相关阅读:
    阿里云系列——3.企业网站备案步骤---2018-1-4
    关于VS2017安装的一点扩充说明(15.5)
    Git环境配置+VSCode中文乱码问题
    抛砖引玉之~sftp
    关于链接文件的探讨
    VSCode插件MSSQL教程(昨天提了一下)
    SQL Server 2017 安装过程中的一点说明(有点意思)
    PS如何批量生成缩略图(方法可以通用其他重复劳动)
    mdb导入SqlServer
    01.码医入门(完篇)
  • 原文地址:https://www.cnblogs.com/songxiaonan/p/6182821.html
Copyright © 2011-2022 走看看