Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python uwsgi将请求映射到进程_Python_Nginx_Uwsgi - Fatal编程技术网

Python uwsgi将请求映射到进程

Python uwsgi将请求映射到进程,python,nginx,uwsgi,Python,Nginx,Uwsgi,在我的python应用程序中,我有一个基于许多sqlalchemy对象的大对象(游戏场) 对于每个简单的请求(例如:移动玩家),我必须创建这个对象,这是资源密集型的。我可以在全局变量中缓存一个就绪对象 但这只有在使用单个uwsgi线程时才有效 cache = {} def applicatio(field_id): global cache if field_id not in cache.keys(): field = get_field(field_id)

在我的python应用程序中,我有一个基于许多sqlalchemy对象的大对象(游戏场)

对于每个简单的请求(例如:移动玩家),我必须创建这个对象,这是资源密集型的。我可以在全局变量中缓存一个就绪对象

但这只有在使用单个uwsgi线程时才有效

cache = {}

def applicatio(field_id):
    global cache
    if field_id not in cache.keys():
        field = get_field(field_id)
        cache[field_id] = field
    field.move_player()
我无法使用
uwsgi.cache
,因为我的对象大于64KB。我不确定它是否适合基于数据库连接的对象

另外还存在另一个问题-如果两个请求同时到达不同的进程,则可能会发生冲突

因此,我希望将请求映射到相同的线程。在nginx中,我可以使用
散列$arg\u字段\u id

但是,我需要用不同的套接字创建许多uwsgi进程。我觉得这是个坏主意

uwsgi能实现这个逻辑吗? 或


也许有人知道如何在进程之间共享对象吗?

uWSGI缓存可以任意大,只需按照此处所述进行调整即可:

顺便说一句,您的方法通常不适用于多个进程,因为根据定义,一个进程不会与其他进程共享地址空间。您可以使用线程(在创建区域时适当锁定),但实际上,uwsgi缓存更容易(由进程自动共享),并且具有一些对您有用的属性:

(潜在竞争条件案例)

线程1:uwsgi.cache\u集('foo',大数据)

线程2:uwsgi.cache\u集('foo',大数据)

线程3:uwsgi.cache\u集('foo',大数据)


只有第一个获得自动缓存锁的选项将创建新对象,其他两个选项将是不可操作的

谢谢!我当时不小心,就看了这篇文档。晚上我会试试这个。当我认为uwsgi.cache不能缓存我的对象时,我是对的。为什么?你可以储存任何水滴。显然,如果您想存储一个复杂的python对象,您必须像使用任何其他缓存服务器一样对其进行pickle/marshall/serialize如果我序列化了这个对象,我将失去与数据库的连接,然后从缓存中加载这个对象,更改一些值,然后尝试session.commit(),我会遇到异常。但我的问题是将mysql改为mongodb,并在应用程序逻辑上做了一些更改。现在,从mongodb快速获取对象,无需许多连接和选择。