- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在为数据分析任务编写网络用户界面。
这是它应该工作的方式:
在用户指定dataset
和learning rate
等参数后,我创建了一个新的task record
,然后启动了这个任务的执行器异步(执行程序可能需要很长时间才能运行。),并且用户被重定向到其他页面。
在搜索了一个 python 的异步库
之后,我开始使用 eventlet
,这是我在 flask
View 函数中编写的内容:
db.save(task)
eventlet.spawn(executor, task)
return redirect("/show_tasks")
上面的代码,执行器根本没有执行。
我的代码可能有什么问题?或者也许我应该尝试别的东西?
最佳答案
虽然您得到了直接的解决方案,但我会尝试回答您的第一个问题并解释为什么您的代码无法按预期工作。
披露:我目前维护 Eventlet。此评论将包含一些简化以适应合理的大小。
有两种方法可以做到Multithreading Eventlet 利用协作方法。核心是Greenlet基本上允许您创建独立的“执行上下文”的库。可以将这种上下文视为所有局部 变量的卡住状态和指向下一条指令的指针。基本上,多线程 = 上下文 + 调度器。 Greenlet 提供了上下文,所以我们需要一个调度器,它可以决定哪个上下文应该立即占用 CPU。事实证明,为了做出决定,我们还应该运行一些代码。这意味着一个单独的上下文(绿色线程)。这个特殊的绿色线程在 Eventlet 代码库中称为 Hub。调度器维护一个有序的 set需要尽快运行的上下文 - 运行队列 和正在等待某事(例如网络 IO 或限时 sleep )完成的上下文集。
但是由于我们正在进行协作式多任务处理,一个上下文将无限期地执行,除非它明确让步给另一个上下文。这将是一种非常可悲的编程风格,并且根据定义与现有库不兼容(指向他们知道谁);所以 Eventlet 所做的是它提供了通用模块的 绿色 版本,这些模块以切换到 Hub 而不是阻止所有内容的方式进行了更改。然后,可能会在其他绿色线程或 Hub 的wait-for-external-events 实现中花费一些时间,在这种情况下,Hub 会切换回发起该事件的绿色线程 - 并且会继续执行。
结束。现在回到您的问题。
eventlet.spawn
实际上做了什么:它创建了一个新的执行上下文。基本上,在内存中分配一个对象。它还告诉调度程序将此上下文放入运行队列,因此在第一个可能的时刻,Hub 将切换到新生成的函数。您的代码不提供这样的时刻。没有地方可以明确放弃执行给其他绿色线程,对于 Eventlet,这通常是通过 eventlet.sleep()
完成的。并且由于您不使用公共(public)模块的绿色版本,因此在其他代码等待时没有机会隐式让步。最合适的(如果不是唯一的)地方是您的 WSGI 服务器的接受循环:它应该让其他绿色线程有机会在等待下一个请求时运行。第一个答案中提到的 eventlet.monkey_patch()
只是一种将所有(或部分)通用模块替换为相应绿色版本的便捷方法。
对整体设计的不当意见在单独的部分中,可以轻松跳过。 如果您正在构建抗错软件,您通常希望限制衍生线程(包括但不限于“绿色”)和进程的执行时间,并且至少报告(日志)或对它们未处理的错误使用react.在提供的代码中,您生成的绿色线程从技术上讲可能会在下一刻或五分钟后运行(同样,因为没有人放弃 CPU)或因未处理的异常而失败。幸运的是,Eventlet 为这两个问题提供了两种解决方案:Timeout with_timeout()允许限制等待时间(记住,如果它不产生,你不可能限制它)和GreenThread.link()捕捉所有异常。在“主”代码中重新引发异常可能很诱人(对我来说是这样),link()
很容易做到这一点,但考虑到异常会从 sleep 和 IO 调用中引发——你在这些地方屈服于集线器。这可能会提供一些非常反直觉的回溯。
关于python - `eventlet.spawn` 没有按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14180179/
对于上下文,routes\index.js:87 在我的 exec 周围(同步)或在我的 exec 内部(异步)。 我在使用库 child_process、win-spawn 或 cross-spaw
我一直在尝试使用 Programming Erlang,版本 2(Joe Armstrong 的书)。我正在尝试解决第 13 章中的第一个问题。 作为解决问题的办法——我想到了这个—— -module
使用rust 0.12。 假设我有一个可发送的闭包,它的定义完全独立于应该在另一个任务中生成它的代码。 关闭类型: type closure_type = ||: 'static + Send; 代码
我相信我在某处读到使用 spawn/1 之间存在差异和 spawn/3谈到热重载,但我找不到有关该主题的任何完整信息。所以我想知道是否真的有区别,如果有,那是什么?一些例子会很棒。谢谢你。 最佳答案
我无法编译这个简单的程序 #include #include #include #include int main(){ printf("Spawning new process...\n")
NetworkObject.spawn()不起作用!我正在为游戏对象使用unity netcode,并尝试通过使用主机实例化它来产生一个游戏对象,然后在客户机上使用getComponent().spa
有没有办法确定所有生成的子进程何时关闭或退出? 例如,我如何确定没有更多进程可以运行,或者换句话说,我的 500 个子进程已全部退出? for (let index = 0; index {
我最近一直在开发一个按需构建服务器。构建服务器是一个 NodeJS/Express REST API,它本质上包装了 Angular CLI 和相关的构建工具,用于完成自定义的按需 Angular 应
我正在尝试使用外部包: npm install [python-shell][1] 现在,我只有基本的 js 文件和包附带的示例: console.log('hey in main.js') var
我正在尝试让 spawn 影响 rm -rf node_modules 后跟 npm install(在 Windows 7 上; nx 个命令由透明安装的 CygWin 提供。所有 nx 个命令都可
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
我正在尝试使用 spawn() 创建子进程有自己的终端 父.js: const spawn = require('child_process').spawn; console.log('started
我正在尝试使用 spawn 运行此命令 var args = ['-ss','00:00:15','-i',storage_path + doc.file_name,'-vframes','1','-
我开始使用 Erlang,在应用从 spawn/3 返回的 PID 时,可以帮助理解不同的结果。到process_info/1方法。 给定这个简单的代码,其中 a/0函数被导出,它只是调用 b/0 ,
我正在尝试运行一个非常简单的 tcl 脚本 package require Expect spawn sftp user@host 我得到的错误是 The system cannot find the
我使用 npm 全局安装了 phantomJs。为什么此代码不起作用? var page = require('webpage').create(); var spawn = require('ch
当我决定自学编程时,我从 Java 开始。尽管我熟悉编写简单的程序化软件(主要是用 PHP),但我最近开始意识到,对于更复杂的操作,我依赖对象。 我的第一个 Java 游戏通过实例化对象以随机速度在随
Julia 的run 函数似乎难以运行source。奇怪的是,如果我在 shell 中运行完全相同的命令,它不会有问题。 有没有办法从 Julia 以编程方式运行命令? julia> cmd = "/
当我运行 grunt-open 时,我不断收到“警告:Spawn ENOENT”问题。 我的设置 我的所有项目文件都在 Google 云端硬盘上。我正在直接对文件进行开发(使用 Google 云端硬盘
当我使用 100 个传感器运行时,我收到了 Erlang 的响应,所有进程都返回某个版本的 进程 中出现错误,退出值:{undef,[{main,watcher_start,[10,0],[]}]}
我是一名优秀的程序员,十分优秀!