Python 的进程和线程概述

1:线程属于进程。创建所有的对象包括方法、变量等均放置到进程中。线程在执行中,在去进程中获取资源使用。 

     线程运行在进程空间内。同一个进程所产生的线程共享同一个内存空间。当进程退出的时候,改进程产生的线程会被强制结束。

2:同一个进程的线程共享一个内存空间和其他资源。

3:不同线程之间不同资源:计数器、堆栈、寄存器

4:进程

       优点:同时利用多个CPU,能够同时进行多个操作。

       缺点: 消耗资源(重新开辟内存空间)

    线程

       优点:共享内存,IO 操作的时候,创造并发操作。

             (在其他语言中,一个进程 中不同线程可以同时操作CPU。Python中一个进程中全局解释器锁的机制-GIL,使得Python中只能有一个线程操作CPU,但是可以同时操作IO, 所以不适用于计算密集型,适用于IO密级型)

       缺点:  资源抢占。(多个线程针对同一个内容进行操作)

5:

   进程不是越多越好, CPU个数= 进程个数

   线程也不是越多越好,具体案例具体分析,请求上下文(记录每一个线程的操作情况)比较消耗资源。

 

6:单线程、单进程 就是主线程、主进程

7: 计算机中执行任务的最小单元是线程。

8: 通过主进程创建子进程。通过主线程创建子线程。

 

threading.Thread 常用的方法

threadming 模块是在_thread模块之上建立的。 thread 模块是以低级、原始的方式来处理和控制线程。 threading 是对thread的二次封装。 提供了更便利的API来处理线程。

两种方式执行线程

1:建立子类继承threadming.thread

    在子类中,重写run 方法。在run 中实现 执行逻辑。 这样在子类线程实例化后, start()后,将自动调用run()方法。

   

1 import threading
 2 import time
 3 
 4 class MyThread(threading.Thread):
 5     def __init__(self, id):
 6         threading.Thread.__init__(self)
 7         self.id = id
 8 
 9     def run(self):
10         x = 0
11         time.sleep(10)
12         print(self.id)
13 
14 if __name__ == "__main__":
15     t1 = MyThread(999)
16     t1.start()
17     for i in range(5):
18         print(i)
19 
20 
21 
22 C:\Python35\python.exe D:/Python0618/homework/day10/a.py
23 0
24 1
25 2
26 3
27 4
28 999

 

2:将可执行对象传递给thread的target

target将对象传递给 thread 的 run 方法。 在threading.thread(target = xxx)

1 #!/usr/bin/evn python
 2 #-*- coding:utf-8 -*-
 3 import threading
 4 import time
 5 
 6 def worker(num):
 7     """
 8     thread worker function
 9     :return:
10     """
11     time.sleep(1)
12     print("Thread %d" % num)
13     return
14 
15 for i in range(20):
16     t = threading.Thread(target=worker, args=(i,),name ="t. % d" % i)
17     t.start()

 

3:常见方法

def __init__(self, group=None, target=None, name=None,
                 args=(), kwargs=None, *, daemon=None):
        """This constructor should always be called with keyword arguments. Arguments are:

        *group* should be None; reserved for future extension when a ThreadGroup
        class is implemented.

        *target* 被 run() 执行的可以调用的对象
        method. Defaults to None, meaning nothing is called.

        *name* 线程名称

        *args* 传递给target的参数

        *kwargs* 传递给target的参数
        
         
         如果建立子类,重写构造方法。格式:
         
         def __init__(self, xxx):
                threading.Thread.__init__(self)
                self.id = id  

           """
    def start(self): 
              """ 激活线程"""

    def run(self): 
"""将可调用的方法传递给thread的构造方法的target。然后通过run()去执行此方法。
                     可以在子类中重写run 方法。建立子类的对象收,start后会自动调用子类的run 方法。
                 """

    def join(self, timeout=None):
    
         """   阻塞主线程,等待子线程逐个执行完毕,一个一个执行结束后,在继续向下执行。
              如果设置timeout表示最多设置 N 秒,如果执行了m秒,m <n, 则执行m 秒后继续,在超时后,不论子线程是否执行完毕,均向下执行"""



        
    def name(self):
    
              """ 获取线程的名称        return self._name"""


  
    def is_alive(self):
    
              """ 判断线程是否alive"""
       

    def isDaemon(self):
        return self.daemon
            """判断是否是后台进程。"""

    def setDaemon(self, daemonic):
       """  设置为后台进程。
        如果A线程调用了B.setDaemon 是将B 设置为后台线程。不设置则默认为用户线程(默认值False)。
        必须在start前设置。
        如果是主进程线程执行完毕,后台进程(子线程)无论是否成功均停止。
        如果用户线程,则等待子线程执行完毕在结束。"""
        

    def getName(self): """得到线程名称"""
        return self.name

    def setName(self, name): """设置线程名称"""
        self.name = name

        
    ident """线程标识符号。 线程标识符号是一个非0整数。在调用了start 之后才能生效否则只返回None"""
    
    def ident(self): """线程标识符号。 线程标识符号是一个非0整数。在调用了start 之后才能生效否则只返回None"""
      
        return self._ident