问题记录贴,留给以后的自己解决

佚名 / 2023-07-28 / 原文

一、Python正则的一个小问题

import re

html = """
<p>hello world</p> <p>anyiya1 lake</p> <p>anyiya2 lake</p>
"""
last_name = 'lake'
pattern = re.compile(f'<p>(.*?){last_name}</p>',re.DOTALL) 
first_name = pattern.search(html).group(1)
print(first_name)

# 输出:hello world</p> <p>anyiya1
# 期望:anyiya1

Q:'?'可以让右边界非贪婪,如何让左边界也尽可能的小呢?

二、Redis异步并发下写的安全问题

# 以下代码处在一个异步模块中,存在并发操作的可能
import redis
redis_pool = redis.ConnectionPool(host='127.0.0.1', port=6379, password='', db=0)
redis_conn = redis.Redis(connection_pool=redis_pool)

# 代码块A ...
while True:
    if redis_conn.get('status') == b'bitlock':
        page.wait_for_timeout(random.randint(10000,20000))
    else:
        redis_conn.watch('status')
        pipe = redis_conn.pipeline()
        pipe.set('status', 'bitlock')
        exec_result = pipe.execute()
        # 更改状态失败,其他线程已经更改了状态
        if exec_result is None:
            continue
        # 更改状态成功
        else:
            break
# 代码块B ...
redis_conn.set('status','unlock')

场景其实是并发下某一模块只能单实例运行,最优策略当然是用队列再做个负载均衡,但是需求急,想先通过上锁逻辑临时处理这个问题。任务并发也没有到百万级,只是在实践过程中引起了思考。
Q:Redis写操作通过事务,这样就能保证写操作的绝对安全吗?(绝对不会并发上锁)