在迭代期间设置更改的大小&穿线

时间:2013-03-30 05:23:55

标签: python python-2.x

我有一个集合我while True在一个线程上循环,而在另一个线程上我偶尔需要添加或丢弃属于该集合的项目。有什么好方法可以做到这一点并避免使用try / except(这种方法会破坏方法的其余部分,并且在我的程序中实际上会导致“故障”)?到目前为止,我所拥有的是非常笨拙的。这是一个复杂的混乱,我不能轻易粘贴在这里,所以这里是我做的简要描述。

当需要将新项目添加到词典时,我将该项目添加到临时列表中。然后,我在主要迭代结束时检查一下,看看列表中是否有任何内容,如果是,则完成添加它们的过程。完成后,我会将临时列表重新分配到空白列表以接受可能需要添加的新项目。对于需要移除的物品我也这样做。所以,再次,抱歉没有代码。这真是一团糟。关于如何做得更好的任何想法?

2 个答案:

答案 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.