假设我写了一个 wsgi application
。我使用多线程配置运行此应用程序Apache2
,以便我的应用程序在每个进程的多个线程中运行:Linux
mod-wsgi
WSGIDaemonProcess mysite processes=3 threads=2 display-name=mod_wsgi
WSGIProcessGroup mysite
WSGIScriptAlias / /some/path/wsgi.py
申请代码为:
def application(environ, start_response):
from foo import racer
status = '200 OK'
response_headers = [('Content-type', 'text/plain')]
start_response(status, response_headers)
return [racer()] #call to racer creates a race condition?
模块 foo.py:
a = 1
def racer():
global a
a = a + 1
return str(a)
我只是用变量创建了一个竞争条件a
吗?我猜,a
是一个模块级变量,它存在于线程中foo.py
并且在线程之间是相同的(共享的)?
更多理论问题由此衍生:
- 同一进程中的并发线程访问并修改同一
a
变量,所以我的示例不是线程安全的? - 如果我的网络服务器是,我在 Linux 上的应用程序的每个线程都是使用API 和函数
Apache
在 C 级创建的,必须执行的是某种 python 解释器的主要函数?还是 Apache 以某种方式保护我免受此错误的影响?pthreads
pthread
- 如果我在像
Tornado
's这样的 python 编写的网络服务器上运行它会HTTPServer
怎样?用python编写的Web服务器将线程实现为python级threading.Thread
对象,并application
在每个线程中运行函数。所以,我想这是一个竞争条件?(我还想,在这种情况下,我可以从实现下面的底层 C 级抽象,pthreads
只threading.Thread
担心 python 函数,因为解释器不允许我修改 C 级共享数据并搞砸它的功能。所以唯一的方法是对我来说打破线程安全就是处理全局变量?是吗?)