Python Tornado聊天演示应用程序线程安全吗?

Python Tornado聊天演示应用程序线程安全吗?,python,tornado,Python,Tornado,我一直在和你玩。随便一看,new_messages方法似乎不是线程安全的-当相同的数组在for循环中迭代时,项目可能会添加到waiters数组中 这个演示不是线程安全的吗?或者,仅仅因为Pythonset对象本身是线程安全的,它是线程安全的吗?Pythonset对象是线程安全的吗?在这个问题上,我似乎发现了相互矛盾的观点(而且在谷歌中,要有效地搜索set这个词在人口学上是很困难的!) 奖励点-为什么在迭代结束时将waiters数组设置为新的集合,而不是清空集合?这是线程安全的,因为纯Python

我一直在和你玩。随便一看,
new_messages
方法似乎不是线程安全的-当相同的数组在
for
循环中迭代时,项目可能会添加到
waiters
数组中

这个演示不是线程安全的吗?或者,仅仅因为Python
set
对象本身是线程安全的,它是线程安全的吗?Python
set
对象是线程安全的吗?在这个问题上,我似乎发现了相互矛盾的观点(而且在谷歌中,要有效地搜索
set
这个词在人口学上是很困难的!)


奖励点-为什么在迭代结束时将
waiters
数组设置为新的
集合
,而不是清空
集合

这是线程安全的,因为纯Python总是线程安全的。由于,在任何时间只有一个Python线程在运行。

这是线程安全的,因为纯Python总是线程安全的。由于的原因,一次只能运行一个Python线程。

默认情况下,Tornado应用程序中不涉及任何线程。Tornado是一个基于事件的系统,因此只有一条执行路径。关于tornado,你需要弄清楚的是,在什么时候,你会让执行回到IOLoop


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

默认情况下,Tornado应用程序中不涉及线程。Tornado是一个基于事件的系统,因此只有一条执行路径。关于tornado,你需要弄清楚的是,在什么时候,你会让执行回到IOLoop


虽然GIL可以防止一类线程错误,您仍然可以编写在程序访问路径之外访问和修改数据的应用程序。

这不是100%正确的:只要始终使用原子操作,但添加到集合不是原子的,那么它就是线程安全的—该方法不使用锁定,并且它包含多条指令,因此,它可以被中断,第二个线程可以尝试更改相同的结构,从而导致数据损坏。这不是100%正确的:只要始终使用原子操作,但添加到集合不是原子的,那么它就是线程安全的-该方法不使用锁定,并且它包含多条指令,因此,它可以被中断,第二个线程可以尝试更改相同的结构,从而导致数据损坏。好的,如果您独自运行Tornado(不在Apache或nginx之后),并且在第一个请求仍在积极执行时另一个请求到达(控制尚未释放回IOLoop),第二个请求怎么办?它只是被拒绝了吗?这就是为什么龙卷风通常在nginx后面运行的原因吗?这样nginx至少可以将第二个请求排队,并在Tornado空闲时发送它?这与套接字侦听队列有关。默认情况下,tornado在开始拒绝连接之前有一个128个连接的积压队列。在nginx或类似设备下运行的原因之一是,由于它是单线程的,如果您有多个CPU,那么您可以通过运行多个进程来使用机器的全部功能。非常感谢您提供的详细信息!好的,那么如果您独自运行Tornado(不在Apache或nginx之后),并且在第一个请求仍在积极执行时(控制尚未释放回IOLoop),另一个请求到达,那么第二个请求会发生什么情况?它只是被拒绝了吗?这就是为什么龙卷风通常在nginx后面运行的原因吗?这样nginx至少可以将第二个请求排队,并在Tornado空闲时发送它?这与套接字侦听队列有关。默认情况下,tornado在开始拒绝连接之前有一个128个连接的积压队列。在nginx或类似设备下运行的原因之一是,由于它是单线程的,如果您有多个CPU,那么您可以通过运行多个进程来使用机器的全部功能。非常感谢您提供的详细信息!