2012-03-05 110 views
1

我一直在玩Tornado chat demo。匆匆一瞥,似乎new_messages方法不是线程安全的 - 好像项目可能被添加到waiters阵列中,而for循环中正在迭代相同的阵列。Python Tornado聊天演示应用程序线程安全吗?

此演示不是线程安全的吗?或者,它是否是线程安全的,因为Python set对象本身是线程安全的? Python set对象线程安全吗?我似乎找到了在这个问题上意见冲突

奖励积分(和单词set是demonically很难在谷歌搜索有效!) - 为什么是waiters数组在迭代结束设置为新set代替清空set

回答

6

默认情况下,没有涉及Tornado应用程序的线程。龙卷风是一个基于事件的系统,所以只有一个执行路径。你需要弄清楚龙卷风的事情是在什么时候让你执行回到IOLoop。

虽然GIL确实能够抵御一类线程错误,但您仍然可以编写访问和修改程序访问路径之外的数据的应用程序。

+0

好的,如果你自己运行Tornado(不在Apache或nginx之后),并且在第一个请求仍在执行的过程中另一个请求到达(控制还没有释放回IOLoop),那么第二个请求会发生什么?它会被拒绝吗?这就是为什么龙卷风通常运行在nginx后面的原因吗?那么nginx至少可以排队第二个请求并在Tornado空闲时发送它? – cailinanne 2012-03-06 11:56:34

+0

这与套接字监听队列有关。默认情况下,tornado在开始拒绝连接之前有128个连接的积压队列。在nginx或类似版本下运行的原因之一是,由于它是单线程的,如果你有多个CPU,那么你可以通过运行多个进程来使用机器的全部功能。 – koblas 2012-03-06 14:24:42

+0

非常感谢您的详细信息! – cailinanne 2012-03-06 18:03:41

-1

它是线程安全的,因为纯Python始终是线程安全的。由于global interpreter lock,一次只能运行一个Python线程。

+4

这不是100%正确的:只要你总是使用原子操作,但是添加到一个集合不是原子的,它只是线程安全的 - 该方法不使用锁定,它包含几个指令,所以它可以被中断,第二个线程可能会尝试更改导致数据损坏的相同结构。 – 2012-03-06 08:06:59