多线程中有线程锁,多进程中也有进程锁。不同的是,在多线程中,数据默认是共享的,每个线程可以访问同一对象;而在多进程中,数据默认是独立的,要想在多进程中共享数据,需要使用特殊的方式实现
上面也提到了,我想重现多进程访问同一资源产生冲突的情况,就首先要构造出多进程的数据共享,如果对多进程的数据共享有疑问,可以参考上一篇文章
没有锁访问共享资源
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| from multiprocessing import Array from multiprocessing import Process import time
def func(array): array[0] = array[0] - 1 time.sleep(1) print(array[0])
array = Array('i', 1)
array[0] = 9 for i in range(9): p = Process(target=func, args=(array,)) p.start() ------------ 0 0 0 0 0 0 0 0 0
|
加锁访问共享资源
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| from multiprocessing import RLock, Lock, Event, Condition, Semaphore from multiprocessing import Array from multiprocessing import Process import time
def func(array, lock): lock.acquire() array[0] = array[0] - 1 time.sleep(1) print(array[0]) lock.release()
array = Array('i', 1)
array[0] = 9 lock = RLock() for i in range(9): p = Process(target=func, args=(array, lock)) p.start() ------------ 8 7 6 5 4 3 2 1 0
|
多进程锁的种类
- RLock
- Lock
- Event
- Condition
- Semaphore
多进程中的锁和多线程中的锁用法是一样的,具体每个锁的用法这里就不一一举例了,可以参考多线程锁的用法
http://docs.20150509.cn/2016/07/22/线程锁/