通过装饰器对函数加进程锁
发现课程”5-1 进程池与进程锁“中为函数添加进程锁是直接修改函数本身,添加lock.acquire()和lock.release()。如果这个函数是第三方库的,我不想把很长的函数体以及依赖拷贝过来修改原函数呢?可以想到使用装饰器,将进程锁实例存储在函数闭包中访问。
但是主进程并没有阻塞,而是提前执行退出了,能看看原因吗?
执行结果:
(base) bohliu@LM-SHD-16509667 多线程-async % python clipboard.py
main process starts: 84300
execution duration: 0.16681385040283203
完整代码如下:
import os
import time
import random
import multiprocessing
def worker(count):
print(count, os.getpid())
sleep = random.randint(1, 3)
time.sleep(sleep)
return f"{count} slept for {sleep}, pid: {os.getpid()}"
# decorate the worker function ?
def wrapperLock(worker, lock):
def help(*args):
# will not access lock passed as input args to help, but access from closure
count = args[0]
if lock:
lock.acquire()
res = worker(count, lock)
if lock:
lock.release()
return res
return help
if __name__ == '__main__':
print('main process starts:', os.getpid())
t_start = time.time()
pool = multiprocessing.Pool(5)
lock = multiprocessing.Manager().Lock()
workerLock = wrapperLock(worker, lock)
for i in range(21):
pool.apply_async(func=workerLock, args=(i,))
pool.close()
pool.join()
print('execution duration:', time.time() - t_start)
14
收起
正在回答
1回答
同学,你好!
以上代码同学的思路不对,同学在调用第三方模块,直接对调用的函数加锁即可,不需要修改原函数,祝学习愉快~
Python全能工程师
- 参与学习 人
- 提交作业 16247 份
- 解答问题 4470 个
全新版本覆盖5大热门就业方向:Web全栈、爬虫、数据分析、软件测试、人工智能,零基础进击Python全能型工程师,从大厂挑人到我挑大厂,诱人薪资在前方!
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星