javascript - 如何在鳗鱼中使用多处理
问题描述
我的程序的逻辑如下:用户点击按钮(在 UI 上)
-> 多进程计数器的触发方法(从js到python)
-> 启动多处理计数器循环(在 python 中)
-> 向 UI 显示计数器编号(从 python 到 html 通过 js)
我的问题是为什么它不能在 UI 上显示计数器编号?
以下是我的代码:
Python:
import eel,time
from multiprocessing import Process
count = 0
eel.init('static')
@eel.expose
def do_something():
global p
p = Process(target=run_forever)
p.start()
print('start a process.')
print(f'The process is alive or not:{p.is_alive}')
def run_forever():
global count
while 1:
print(time.time())
time.sleep(1)
count = count + 1
eel.js_counter(count)
@eel.expose
def end_do_something():
global p
p.terminate()
p.terminate()
print('stop process')
p.join()
print(f'The process is alive or not:{p.is_alive}')
if __name__ == '__main__':
eel.start('index.html',size=(600,400))
索引.html:
<h1>Hello World</h1>
<p ></p>
<b></b>
<form>
<input type="text" id="myText" required/>
<input type="submit" onclick="return input_val()" value="print text">
</form>
<button class="call_python" onclick="btn_index()">Call_python start timing</button>
<a href="another_page.html">go to another page</a>
<script type="text/javascript" src="./index.js"></script>
<script type="text/javascript" src="/eel.js"></script>
另一个页面.html:
<h1>Hello World</h1>
<p>This is home</p>
<input type="button" onclick="change_input_val()" value="change text">
<input type="button" onclick="end_counter()" value="end counter">
<a href="index.html">go back to index</a>
<script type="text/javascript" src="./another_page.js"></script>
<script type="text/javascript" src="/eel.js"></script>
index.js:
async function btn_index(){
await eel.do_something()();
}
eel.expose(js_counter);
function js_counter(count){
sessionStorage.setItem("counter", count);
document.querySelector('p').innerHTML = count
}
function input_val(){
document.querySelector('b').innerHTML = document.getElementById("myText").value;
sessionStorage.setItem("test", document.getElementById("myText").value);
return false;
}
window.onload = function (){
document.querySelector('b').innerHTML = sessionStorage.getItem('test');
document.querySelector('p').innerHTML = sessionStorage.getItem('counter');
}
另一个_page.js:
function change_input_val(){
let a = sessionStorage.getItem('test');
a += 'testing';
sessionStorage.setItem("test", a);
}
async function end_counter(){
await eel.end_do_something()();
}
环境:
- 操作系统:Windows 10 1909
- 浏览器:铬
- 版本:EEL 0.14.0
- Python 3.8.7 32 位
问题:
如果我阻止多处理程序,它可以工作!!(显示计数器数量)
但我想使用多处理来调用计数器。
任何人都可以帮助解决这个问题,不显示在 UI 上,但我想显示,拜托
谢谢!!
解决方案
请记住,当您使用多处理时,您将启动一个具有单独内存空间的单独进程。对象和变量没有以任何方式连接。如果需要通信,则需要使用 aQueue
或 a Pipe
。
通常,当您可以让其他进程完成大量工作,然后通过队列向母舰返回一些信号时,多处理效果最佳。
推荐阅读
- java - 在Java中的IF条件下处理变量字符串零
- php - 将字符串拆分为两个单词后将两个字母大写
- python - 请求(或 httplib2.request)返回状态码的时间过长
- excel - 满足条件时,在另一张纸上复制仅粘贴部分行,其中一个单元格包含图片
- jquery - 向 kendo 对话框标题栏添加按钮/html 内容
- f# - 如何在 f# 中使用 npgsql 处理可能的 Null 值?
- javascript - 第一个字符之前的符号 (!@#$%^&*_) 的正则表达式
- java - 版本:属性的使用版本
- chromium - 如何在 codecept.conf.js 中设置 chromium 启动选项?
- django - 如何将 tasks.py 外部定义的函数转换为 Celery 任务并让 Celery 工作人员在 Django 中处理它