• python 进程与线程


    一、进程

    1.定义

    进程:程序的一次执行过程

      每个进程都提供执行程序所需的资源。 进程具有虚拟地址空间,可执行代码,系统对象的打开句柄,安全上下文,唯一进程标识符,环境变量,优先级类别,最小和最大工作集大小以及至少一个执行线程。 每个进程都从单个线程(通常称为主线程)开始,但是可以从其任何线程中创建其他线程。

    (1)直接调用

    (2)继承式调用

    3.进程间通讯

    4.进程池

    二、线程

    1.定义

    线程:操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务

    进程与线程的区别:

      线程共享创建它的进程的地址空间; 进程具有自己的地址空间。
      线程可以直接访问其进程的数据段。 流程具有其父进程数据段的副本。
      线程可以直接与其进程中的其他线程通信。 进程必须使用进程间通信与同级进程进行通信。
      新线程很容易创建; 新线程需要复制父线程。
      线程可以对同一进程的线程进行相当多的控制。 进程只能控制子进程。
      对主线程的更改(取消,优先级更改等)可能会影响该进程其他线程的行为; 对父进程的更改不会影响子进程。
     

    2.GIL(Global Interpreter Lock)

    全局解释器锁:每个线程在执行时候都需要先获取GIL,保证同一时刻只有一个线程可以执行代码,即同一时刻只有一个线程使用CPU,也就是说多线程并不是真正意义上的同时执行。

    3.线程调用方式

    (1)直接调用

    import threading
    import time
     
    def sayhi(num): #定义每个线程要运行的函数
        print("running on number:%s" %num)
        time.sleep(3)
        
    if __name__ == '__main__':
        t1 = threading.Thread(target=sayhi,args=(1,)) #生成一个线程实例
        t2 = threading.Thread(target=sayhi,args=(2,)) #生成另一个线程实例
     
        t1.start() #启动线程
        t2.start() #启动另一个线程
        print('
    ')
        print(t1.getName()) #获取线程名
        print(t2.getName())
    

    (2)继承式调用

    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)
        t2 = MyThread(2)
        t1.start()
        t2.start()
    

      

    3.join

      一些线程执行后台任务,例如发送keepalive数据包,执行定期垃圾回收等。 这些仅在主程序正在运行时才有用,并且可以在其他非守护程序线程退出后将其杀死。

      如果没有守护程序线程,则必须跟踪它们,并告诉它们退出,然后程序才能完全退出。 通过将它们设置为守护程序线程,可以让它们运行并忘记它们,并且在程序退出时,所有守护程序线程都会自动终止。

    4.线程锁Lock、Rlock、信号量

    5.Event

    6.线程池

     

  • 相关阅读:
    [LeetCode] 199. Binary Tree Right Side View
    [LeetCode] 360. Sort Transformed Array
    [LeetCode] 146. LRU Cache
    [LeetCode] 28. Implement strStr()
    [LeetCode] 498. Diagonal Traverse
    [LeetCode] 545. Boundary of Binary Tree
    [LeetCode] 937. Reorder Data in Log Files
    软件开发之我剑!软件测试, 房子的刚性需求【原】
    c#调用Delphi的dll函数遇到的问题及解决方法
    C# 回调函数
  • 原文地址:https://www.cnblogs.com/nxf-rabbit75/p/7786626.html
Copyright © 2020-2023  润新知