zoukankan      html  css  js  c++  java
  • 线程

    python 线程

         线程是进程中执行运算的最小单位,是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。

    threading模块提供的类:  
      Thread, Lock, Rlock, Condition, [Bounded]Semaphore, Event, Timer, local。

    threading 模块提供的常用方法: 
      threading.currentThread(): 返回当前的线程变量。 
      threading.enumerate(): 返回一个包含正在运行的线程的list。正在运行指线程启动后、结束前,不包括启动前和终止后的线程。 
      threading.activeCount(): 返回正在运行的线程数量,与len(threading.enumerate())有相同的结果。

    threading 模块提供的常量:

      threading.TIMEOUT_MAX 设置threading全局超时时间。

    Thread类:

    Thread是线程类,有两种使用方法,直接传入要运行的方法或从Thread继承并覆盖run():

    方法一:
    import time
    import random
    from threading import Thread
    
    def piao(name):
        print('%s piaoing' %name)
        time.sleep(random.randrange(1,5))
        print('%s piao end' %name)
    
    if __name__ == '__main__':
        t1=Thread(target=piao,args=('egon',))
        t1.start()
        print('主线程')
    #
    
    
    import time
    import random
    from threading import Thread
    
    方法二:
    class MyThread(Thread):
        def __init__(self,name):
            super().__init__()
            self.name=name
    
        def run(self):
            print('%s piaoing' %self.name)
    
            time.sleep(random.randrange(1,5))
            print('%s piao end' %self.name)
    
    if __name__ == '__main__':
        t1=MyThread('egon')
        t1.start()
        print('')
    好处
    • (1)易于调度。

    • (2)提高并发性。通过线程可方便有效地实现并发性。进程可创建多个线程来执行同一程序的不同部分。

    • (3)开销少。创建线程比创建进程要快,所需开销很少

    2、进程的基本状态及状态之间的关系

    状态:运行、阻塞、挂起阻塞、就绪、挂起就绪

    状态之间的转换:

    • (1)准备就绪的进程,被CPU调度执行,变成运行态;

    • (2)运行中的进程,进行I/O请求或者不能得到所请求的资源,变成阻塞态;

    • (3)运行中的进程,进程执行完毕(或时间片已到),变成就绪态;

    • (4)将阻塞态的进程挂起,变成挂起阻塞态,当导致进程阻塞的I/O操作在用户重启进程前完成(称之为唤醒),挂起阻塞态变成挂起就绪态,当用户在I/O操作结束之前重启进程,挂起阻塞态变成阻塞态;

    • (5)将就绪(或运行)中的进程挂起,变成挂起就绪态,当该进程恢复之后,挂起就绪态变成就绪态;

    3、线程和进程的关系以及区别?

    ** 进程和线程的关系:**

    • (1)一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。

    • (2)资源分配给进程,同一进程的所有线程共享该进程的所有资源。

    • (3)处理机分给线程,即真正在处理机上运行的是线程

    • (4)线程在执行过程中,需要协作同步。不同进程的线程间要利用消息通信的办法实现同步。线程是指进程内的一个执行单元,也是进程内的可调度实体.

    进程与线程的区别:

    • (1)调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位

    • (2)并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行

    • (3)拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源.

    • (4)系统开销:在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销。

    从程序上反映区别:

    # 1、开进程的开销远大于开线程
    import time
    from threading import Thread
    from multiprocessing import Process
    
    def piao(name):
        print('%s piaoing' %name)
        time.sleep(2)
        print('%s piao end' %name)
    
    if __name__ == '__main__':
        # p1=Process(target=piao,args=('egon',))
        # p1.start()
    
        t1=Thread(target=piao,args=('egon',))
        t1.start()
        print('主线程')
    # 2、同一进程内的多个线程共享该进程的地址空间,而进程的地址内存是相互隔离的
    from threading import Thread
    from multiprocessing import Process
    
    n=100
    def task():
        global n
        n=0
    
    if __name__ == '__main__':
        # p1=Process(target=task,)
        # p1.start()
        # p1.join()
    
        t1=Thread(target=task,)
        t1.start()
        t1.join()
    
        print('主线程',n)
  • 相关阅读:
    java利用Scanner获取键盘输入
    实验四:数据类型与运算符 4、运算符及表达式实训
    实验三:数据类型与运算符 4、运算符及表达式实训
    Java运算符优先级
    laravel jobs 进程
    安装laravel horizon进程管理
    layui导出表格
    layui无限级分类
    Linux中基本命令
    gogs git 部署服务端钩子 自动发布项目
  • 原文地址:https://www.cnblogs.com/z18271397173/p/9221710.html
Copyright © 2011-2022 走看看