我有一个集合我while True
在一个线程上循环,而在另一个线程上我偶尔需要添加或丢弃属于该集合的项目。有什么好方法可以做到这一点并避免使用try / except(这种方法会破坏方法的其余部分,并且在我的程序中实际上会导致“故障”)?到目前为止,我所拥有的是非常笨拙的。这是一个复杂的混乱,我不能轻易粘贴在这里,所以这里是我做的简要描述。
当需要将新项目添加到词典时,我将该项目添加到临时列表中。然后,我在主要迭代结束时检查一下,看看列表中是否有任何内容,如果是,则完成添加它们的过程。完成后,我会将临时列表重新分配到空白列表以接受可能需要添加的新项目。对于需要移除的物品我也这样做。所以,再次,抱歉没有代码。这真是一团糟。关于如何做得更好的任何想法?
答案 0 :(得分:2)
正如我在评论中提到的,考虑使用Queue
模块的Queue
类的实例在程序中运行的不同线程之间传递信息。该模块实现了几种队列,因此您可以选择最适合您正在执行的操作的队列,并同步对它们的访问。
Queue
类是为多线程编程而设计的,因此它的方法会自动为您处理所有必需的锁定细节,从而防止我认为您在问题中描述的同时访问问题。
例如,可以测试队列是满还是空,从而减少了在检索项目时使用try / except子句的需要。或者,如果需要,Queue
的{{1}}方法可以选择阻止并可能超时。
很抱歉,如果没有一些示例代码来说明您实际尝试的内容,我就无法更具体。
答案 1 :(得分:0)
对于set_name = set()
,如果元素不存在,set_name.discard(element)
将不会引发异常。
编辑:
help(set.discard)
discard(...)
Remove an element from a set if it is a member.
If the element is not a member, do nothing.