26演示进程死锁

 

import multiprocessing as mp
import time
'''
示例代码:创建了两个进程,并且两个进程都试图获取两个资源lock_b 和 lock_a。如果两个进程在同时获取资源时产生了交叉等待,发生死锁.
要避免多个进程频繁竞争锁,可以尝试以下方法:
1. 减少锁的使用:在设计应用程序时,尽量减少对共享资源的锁定。这可以通过避免共享状态或使用其他并发模型来实现。
2. 使用更细粒度的锁:如果可能,将一个大的锁拆分成多个较小的锁,以便不同进程可以独立地操作不同的资源。
3. 使用无锁数据结构或原子操作:尽量使用无锁的数据结构,例如线程安全的队列或字典,而不是使用显式锁。此外,可以使用原子操作来执行特定的共享资源访问,避免锁。
4. 减少锁的持有时间:在使用锁的临界区内,尽量将操作简化为最小的时间范围,以便其他进程可以更快地获得锁。
5. 使用读写锁:如果有多个进程在读取共享资源而很少修改它,可以考虑使用读写锁。读写锁允许多个进程同时读取共享资源,但只有一个进程能够对资源进行写操作。
6. 优化资源分配:如果多个进程频繁竞争相同的资源,可以重新评估资源的分配策略,以降低竞争的频率。
7. 使用进程池或任务调度:使用进程池或任务调度器,可以有效地管理多个进程的执行,并减少对资源的频繁竞争。

'''

def process_a(lock_a, lock_b):
    with lock_a:
        print('Process A acquired lock A')
        # 模拟处理一段耗时操作
        for i in range(2):
            time.sleep(3)
        with lock_b:
            print('Process A acquired lock B')

def process_b(lock_a, lock_b):
    with lock_b:
        print('Process B acquired lock B')
        # 模拟处理一段耗时操作
        for i in range(2):
            time.sleep(3)
        with lock_a:
            print('Process B acquired lock A')

if __name__ == '__main__':
    lock_a = mp.Lock()
    lock_b = mp.Lock()

    process1 = mp.Process(target=process_a, args=(lock_a, lock_b))
    process2 = mp.Process(target=process_b, args=(lock_a, lock_b))

    process1.start()
    process2.start()

    process1.join()
    process2.join()

 

posted @ 2023-10-03 20:06  冷夜O  阅读(35)  评论(0)    收藏  举报