doraemon的python 线程详解

### 9.3 线程(开销小)

- 线程是进程中的一部分,每一个进程至少有一个线程
- 进程是计算机最小的资源分配单位(进程是负责圈资源)
- 线程是计算机中能被CPU调度最小单位(线程是负责执行具体代码)
- 比较:
  - 进程:数据隔离 开销大 是一个资源分配单位
  - 线程:数据共享 开销小 是进程的一部分

#### 9.3.1 GIL 全局解释器锁

GIL锁:

- 保证了整个python程序中,只有一个线程被CPU执行
- 原因:cpython解释器中的特殊垃圾回收机制
- GIL锁导致了线程不能并行,可以并发

但是使用线程并不会影响高IO型的操作,只会对高计算型的成语有效率上的影响

#### 9.3.2 Thread模块

multiprocessing是完全房展threading的类写的,使用方法基本一样

```python
#单个子线程
from threading import Thread

def func():
    print('liujia')
    
Thread(target=func).start()

```

```python
#多个子线程
import os
import time
from threading import Thread

def func(i):
    print('start son thread',i)
    time.sleep(0.2)
    print('end',os.getpid())
    
for i in range(10):
    Thread(target=func,args=(i,)).start()
print('main')
```

```python
#join方法 阻塞 知道子进程执行结束
def func(i):
    print('start son thread',i)
    time.sleep(0.2)
    print('end',os.getpid())
    
t_l = []
for i in range(10):
    t = Thread(target=func,args=(i,))
    t.start()
    t_l.append(t)
for t in t_l:t.join()
print('子线程执行完毕')
    
```

```python
#面向对象启动线程
class MyThread(Thread):
    def __init__(self,i):
        self.i = i
        super().__init__()
    def run(self):
        print('start',self.i,self.ident)
        time.sleep(1)
        print('end',self.i)

for i in range(10):
    t = MyThread(i)
    t.start()
    print(t.ident)
```

```python
#线程里的一些其他方法
from threading import current_thread,enumerate,active_count
def func(i):
    t = current_thread()
    print('start son thread',i,t.ident)
    time.sleep(1)
    print('end son thread',i,os.getpid())

t = Thread(target=func,args=(1,))
t.start()
print(t.ident)
print(current_thread().ident)   # 水性杨花 在哪一个线程里,current_thread()得到的就是这个当前线程的信息
print(enumerate())
print(active_count())   # =====len(enumerate())
```

注意:

- 守护线程一直等到所有非守护线程结束才会结束
- 除了守护了主线程的代码之外也会守护子线程
原文地址:https://www.cnblogs.com/doraemon548542/p/11427302.html