有没有办法对python中的dict进行test-and-set操作?
Is there a way to perform test-and-set operation on dict in python?
我有一个多线程应用程序,我需要在其中使用全局字典来记住和处理请求。
问题是,我不应该执行相同的请求两次,所以我需要 dict 来测试密钥是否存在。没有就插入,有就报错
所有代码都在 python 中运行,因此 GIL 不应该是相关的。
这在 python 可行吗?
在这里锁可以工作,但我正在尝试找到一种更自然的方法来解决它。
你当然可以创建一个字典并在线程之间共享它,但是你应该用锁保护每个对字典的访问(无论是读还是写)。
Here lock would work but I am trying to find a more natural way to
solve it.
使用锁等同步原语是实现涉及并发的可靠架构的自然方式。
话虽这么说,但可以在多个层面上确保某个请求没有被重复提出。如果您使用描述的字典来执行此操作,则需要在 执行请求之前 插入标识符。伪代码:
with lock.acquire():
if url in d:
return # do not perform request
d.[url] = True
perform_request(url)
如果请求失败,您可能想再次从 dict 中删除密钥(当然不是不获取锁)。
我有一个多线程应用程序,我需要在其中使用全局字典来记住和处理请求。
问题是,我不应该执行相同的请求两次,所以我需要 dict 来测试密钥是否存在。没有就插入,有就报错
所有代码都在 python 中运行,因此 GIL 不应该是相关的。
这在 python 可行吗?
在这里锁可以工作,但我正在尝试找到一种更自然的方法来解决它。
你当然可以创建一个字典并在线程之间共享它,但是你应该用锁保护每个对字典的访问(无论是读还是写)。
Here lock would work but I am trying to find a more natural way to solve it.
使用锁等同步原语是实现涉及并发的可靠架构的自然方式。
话虽这么说,但可以在多个层面上确保某个请求没有被重复提出。如果您使用描述的字典来执行此操作,则需要在 执行请求之前 插入标识符。伪代码:
with lock.acquire():
if url in d:
return # do not perform request
d.[url] = True
perform_request(url)
如果请求失败,您可能想再次从 dict 中删除密钥(当然不是不获取锁)。