python进程中的锁

python中进程的锁和线程的锁用法一样

  1. Lock锁(只能锁一个,放一个)
import multiprocessing
import time

lock = multiprocessing.Lock()
def task(args):
    p = multiprocessing.current_process()
    lock.acquire()
    time.sleep(2)
    print(p.name)
    print(args)
    lock.release()

def run():
    for i in range(10):
        p = multiprocessing.Process(target=task,args=(i,))
        p.start()

if __name__ == '__main__':
    run()

2.RLock锁(可以上多把锁,也是锁一个放一个)

lock = multiprocessing.RLock()
def task(args):
    p = multiprocessing.current_process()
    lock.acquire()
    lock.acquire()
    time.sleep(2)
    print(p.name)
    print(args)
    lock.release()
    lock.release()

def run():
    for i in range(10):
        p = multiprocessing.Process(target=task,args=(i,))
        p.start()

if __name__ == '__main__':
    run()
  1. seamphore锁(可以控制进入临界区的进程数量)
lock = multiprocessing.BoundedSemaphore(3)
def task(args):
    p = multiprocessing.current_process()
    lock.acquire()
    time.sleep(2)
    print(p.name)
    print(args)
    lock.release()

def run():
    for i in range(10):
        p = multiprocessing.Process(target=task,args=(i,))
        p.start()

if __name__ == '__main__':
    run()
  1. Condition锁(可以控制任意一次放出的进程的数量)
lock = multiprocessing.Condition()
def task(args):
    p = multiprocessing.current_process()
    lock.acquire()
    lock.wait()
    time.sleep(2)
    print(p.name)
    print(args)
    lock.release()

def run():
    for i in range(10):
        p = multiprocessing.Process(target=task,args=(i,))
        p.start()

if __name__ == '__main__':
    run()
    while True:
        num = int(input("请输入要释放的进程数量:"))
        lock.acquire()
        lock.notify(num)
        lock.release()
  1. Event锁
lock = multiprocessing.Event()
def task(args):
    p = multiprocessing.current_process()
    lock.wait()
    time.sleep(2)
    print(p.name)
    print(args)

def run():
    for i in range(10):
        p = multiprocessing.Process(target=task,args=(i,))
        p.start()
    lock.set()  #使锁失效
    print("锁失效的结果")
def run2():
    lock.clear()#使锁再次生效
    for i in range(10):
        p = multiprocessing.Process(target=task,args=(i,))
        p.start()
    print("锁生效的结果")
Python中,GIL(全局解释器)是一种机制,它确保在任何给定时间只有一个线程在解释器中执行字节码。这意味着在多线程的情况下,Python的多线程并不能真正实现并行执行,而只是并发执行。 GIL的存在是为了保护Python解释器内部数据结构的一致性,因为这些数据结构在多线程环境下可能会出现竞争条件。然而,这也导致了Python在处理计算密集型任务时的性能问题,因为只有一个线程可以执行字节码。 虽然GIL对于IO密集型任务并不是一个问题,因为线程在等待IO操作完成时会释放GIL,但对于计算密集型任务,GIL会成为性能瓶颈。 要解决GIL的限制,有几种方法可以尝试: 1. 使用多进程而不是多线程:Python的multiprocessing模块提供了一种在多个进程中执行任务的方式,每个进程都有自己的解释器和GIL。这样可以实现真正的并行执行。你可以使用multiprocessing模块来将计算密集型任务分配给多个进程执行。 2. 使用其他解释器:除了CPython,还有其他的Python解释器,如Jython、IronPython和PyPy。这些解释器没有GIL的限制,因此可以实现真正的并行执行。但需要注意的是,这些解释器可能不支持所有的Python库和功能。 3. 使用C扩展:对于计算密集型任务,可以使用C扩展来绕过GIL。通过将计算部分的代码编写为C扩展,可以在不受GIL限制的情况下执行计算。 下面是一个使用多进程的示例代码,演示了如何绕过GIL实现并行执行: ```python from multiprocessing import Pool def calculate_square(n): return n * n if __name__ == '__main__': numbers = [1, 2, 3, 4, 5] pool = Pool() result = pool.map(calculate_square, numbers) print(result) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值