python 并发编程
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python 并发编程相关的知识,希望对你有一定的参考价值。
多进程和多线程的守护区别
首先明确一点,无论是多进程还是多线程,主进程或主线程都会等待子进程或子线程退出才会退出。
无论是进程还是线程,都遵循:守护xxx会等待主xxx运行完毕后被销毁. 需要强调的是:运行完毕并非终止运行
1.对主进程来说,运行完毕指的是主进程代码运行完毕
2.对主线程来说,运行完毕指的是主线程所在的进程内所有非守护线程统统运行完毕,主线程才算运行完毕
也就是说:
- 主进程在其代码结束后就已经算运行完毕了(守护进程在此时就被回收),然后主进程会一直等非守护的子进程都运行完毕后回收子进程的资源(否则会产生僵尸进程),才会结束,
2 . 主线程在其他非守护线程运行完毕后才算运行完毕(守护线程在此时就被回收)。因为主线程的结束意味着进程的结束,进程整体的资源都将被回收,而进程必须保证非守护线程都运行完毕后才能结束。
import os
import time
from multiprocessing import Process
def task1():
while True:
print('task1', os.getpid())
time.sleep(1)
def task2():
while True:
print('task2')
time.sleep(1.5)
if __name__ == '__main__':
p1 = Process(target=task1)
p1.daemon = True
p1.start()
p2 = Process(target=task2)
p2.start()
# task1 不会被执行,因为进程的开启是比线程慢的,所以一般情况下是主进程代码执行完毕再执行子进程
print('main over')
GIL 锁
GIL锁是一把cpython解释器帮我们加的互斥锁,加这把锁是基于内存管理机制考虑的。如果没有这把锁,再考虑多个线程同时只能被一个CPU处理的情况,因为没有锁的多线程的并发肯定会设计到资源抢占。垃圾回收机制的活还没干完就被另外一个线程抢走了CPU的执行权限,恰好这个线程又要对垃圾回收要处理的一个变量做相关操作(比如加1),那这种情况垃圾回收就没有意义了。所以,在进程空间的外面加了一把锁,如果垃圾回收机制抢到这把锁,把垃圾回收的活干完释放锁,这样垃圾回收机制才能实现。
GIL锁和我们自己在程序申明的锁有什么区别?GIL锁可以看做是整个进程空间出口上的锁,而我们自己申明的锁是用来锁住进程里面的的数据的。
多进程的锁
多进程是数据隔离的,为啥还需要锁呢?因为多进程虽然是数据隔离,但是却共享文件系统和打印终端。如果是开启多个进程队文件进程读写操作,那么就需要用到锁
from multiprocessing import Process,Lock
import time,json
def search():
dic=json.load(open('ticket.txt'))
print('