- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我目前正在熟悉 Python 中 Web 应用程序的 WSGI 规范。我设置 Apache(使用 mod-wsgi)来调用一个当前仅显示线程 ID 号的小应用程序,以尝试观察每个请求的唯一性:
import thread
def application(environ, start_response)
start_response('200 Ok', [('Content-type', 'text/plain')])
output = "current thread id: %s" % thread.get_ident()
return [output]
我很快注意到,过了一会儿,相同的线程被后续请求重用。
如果我的理解是正确的,为了让我的应用程序具有“特定于上下文的”变量,我需要使用类似于以下的方案来存储它们:
lock = thread.allocate_lock()
lock.acquire()
thread_id = get_ident()
threadsafe[thread_id]['user'] = request.username
lock.release()
然后我可以以类似的方式从应用程序的不同部分访问它们。在这种情况下,我唯一的保证是该值属于该特定线程。但是,使用同一线程的请求可能仍然会互相干扰(例如,请求访问先前请求的剩余值)。我的结论是,为了以真正独特的方式处理每个请求,除了“thread_id”之外,我还需要另一个 key 来区分使用同一线程的请求。
使用唯一的 key (例如 uuid),我可以做到这一点
lock.acquire()
uuid = uuid.uuid4()
thread_id = get_ident()
threadsafe[(thread_id, uuid)]['user'] = request.username
lock.release()
但这意味着我有办法以线程安全的方式检索 uuid 值,就像我稍后可以检索 thread_id 一样。
我得出的结论正确吗?如果是这样,我如何获得额外的 key ?
编辑
我突然想到我的问题是错误的二分法。我的观点是线程可以与其自身同时运行,而事实上这是不可能的。使用同一线程的请求必须串行运行。因此,我实际上可以使用 uuid 来避免使用线程的过时值,但只有在将其存储为线程保存值本身之后。
# somewhere early in the request
threadsafe[thread_id]['current_uuid'] = uuid.uuid4()
# later
lock.acquire()
thread_id = get_ident()
uuid = threadsafe[thread_id]['current_uuid']
threadsafe[(thread_id, uuid)]['user'] = request.username
lock.release()
最佳答案
此答案基于 @user590028 答案的评论中开发的新信息。
您说过您的目标是拥有线程安全的持久数据。因为您还说您正在熟悉 WSGI 规范,所以我觉得这个链接特别相关:Application_Global_Variables
...although global data can be used, it can only be used to cache data which can be safely reused within the context of that single process. You cannot use global data as a means of holding information that must be visible to any request handler no matter which process it runs in.
您的应用程序不仅可能在多个线程下运行,而且可能在多个进程下运行。根据上面的链接,持久数据的推荐解决方案(超出当前请求的数据)是使用外部存储解决方案(文件系统、数据库、memcached...)
您尝试使用锁来保存状态信息的操作似乎完全没有必要。无论如何,每个请求都应被视为唯一。如果客户端用户向您的应用程序发出 10 个请求,并且您希望在这些请求中保留数据,那么您应该使用 session key (例如 cookie),当客户端的请求是新的(不包含 session )时,您首先向客户端建立该 session key ,然后您在响应中返回它,并期望将来的请求提供此 key 。随后,有一些库旨在为您提供此功能: http://www.ollycope.com/software/pesto/session.html
wsgi 应用程序有一个入口点,在这种情况下,您的示例将其定义为名为“应用程序”的函数。它也可能是一个类或任何可调用的东西。由于范围的原因,您的变量本质上是上下文特定的。无论您对该范围执行什么操作,都与运行同一处理程序的任何其他线程完全不同。 “应用程序”函数可能更复杂,调用其他函数并传递其变量,直到最终返回其响应主体。您还可以创建一个类实例,其中包含处理请求和生成响应所需的所有功能,并使用其自己的实例变量。
如果前两个建议都不适用于您所要求的内容,我认为剩下的唯一可能性是您确实希望将数据存储在数据库、文件系统、memcached 或 redis 等中。 uuid4 将是唯一的,但只有当您在响应中传递它并让客户端返回它以保持与该数据的关联时,它的值才有意义。
关于python - WSGI:使每个请求真正独一无二,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10049872/
我正在尝试从该网站抓取历史天气数据: http://www.hko.gov.hk/cis/dailyExtract_uc.htm?y=2016&m=1 在阅读了 AJAX 调用后,我发现请求数据的正确
我有两个 postman 请求 x,y,它们命中了两个不同的休息 api X,Y 中的端点。 x 会给我一个身份验证 token ,这是发出 y 请求所必需的。如何在请求 y 中发出请求 x ?也就是
我使用请求库通过 API 与其他服务器进行通信。但现在我需要同时发送多个(10 个或更多)POST 请求,并且只有在所有响应都正确的情况下才能进一步前进。通常语法看起来有点像这样: var optio
背景:当用户单击按钮时,其类会在class1和class2之间切换,并且此数据是通过 AJAX 提交。为了确认此数据已保存,服务器使用 js 进行响应(更新按钮 HTML)。 问题:如果用户点击按钮的
我正在将 Node.js 中的请求库用于 Google 的文本转语音 API。我想打印出正在发送的请求,如 python example . 这是我的代码: const request = requi
我经常使用requests。最近我发现还有一个 requests2 和即将到来的 requests3 虽然有一个 page其中简要提到了 requests3 中的内容,我一直无法确定 requests
我正在尝试将图像发送到我的 API,然后从中获取结果。例如,我使用发送一个 bmp 图像文件 file = {"img": open("img.bmp)} r = requests.post(url,
我发现 Google Cloud 确保移出其物理环境的任何请求都经过强制加密,请参阅(虚拟机到虚拟机标题下的第 6 页)this link Azure(和 AWS)是否遵循类似的程序?如果有人能给我指
我有一个 ASP.NET MVC 应用程序,我正在尝试在 javascript 函数中使用 jQuery 来创建一系列操作。该函数由三部分组成。 我想做的是:如果满足某些条件,那么我想执行同步 jQu
我找不到如何执行 get http 请求,所以我希望你们能帮助我。 这个想法是从外部url(例如 https://api.twitter.com/1.1/search/tweets.json?q=tw
我的应用只需要使用“READ_SMS”权限。我的问题是,在 Android 6.0 上,当我需要使用新的权限系统时,它会要求用户“发送和查看短信”。 这是我的代码: ActivityCompat.re
我的前端代码: { this.searchInput = input; }}/> 搜索 // search method: const baseUrl = 'http://localho
我有一个由 AJAX 和 C# 应用程序使用的 WCF 服务, 我需要通过 HTTP 请求 header 发送一个参数。 在我的 AJAX 上,我添加了以下内容并且它有效: $.ajax({
我正在尝试了解如何使用 promises 编写代码。请检查我的代码。这样对吗? Node.js + 请求: request(url, function (error, response, body)
如果失败(除 HTTP 200 之外的任何响应代码),我需要重试发送 GWT RPC 请求。原因很复杂,所以我不会详细说明。到目前为止,我在同一个地方处理所有请求响应,如下所示: // We
当用户单击提交按钮时,我希望提交表单。然而,就在这种情况发生之前,我希望弹出一个窗口并让他们填写一些数据。一旦他们执行此操作并关闭该子窗口,我希望发出 POST 请求。 这可能吗?如果可能的话如何?我
像 Facebook 这样的网站使用“延迟”加载 js。当你必须考虑到我有一台服务器,流量很大时。 我很感兴趣 - 哪一个更好? 当我一次执行更多 HTTP 请求时 - 页面加载速度较慢(由于限制(一
Servlet 容器是否创建 ServletRequest 和 Response 对象或 Http 对象?如果是ServletRequest,谁在调用服务方法之前将其转换为HttpServletReq
这是维基百科文章的摘录: In contrast to the GET request method where only a URL and headers are sent to the serv
我有一个循环,每次循环时都会发出 HTTP post 请求。 for(let i = 1; i console.log("succes at " + i), error => con
我是一名优秀的程序员,十分优秀!