我有一个内置了Angular的Electron应用程序(最新版本)。我需要在子进程中从项目中执行javascript(而非打字稿)文件(一些我不想同步执行的繁重任务)。
尝试过以下解决方案:
1.创建函数Loader
,将所有内容放在其中:
export function Loader() { console.log(111); }
然后创建子进程的组件:
import { Loader } from 'some/path/to/loader.js';
public doSomething(): void {
fork(
Loader,
[ ... some string args here ],
{ env: { 'ELECTRON_RUN_AS_NODE': '1' } }
)
.on(
'error',
(error: Error): void => console.error(error)
)
.on(
'exit',
async (code: number | null): Promise<void> => {
if (code === 0) {
console.log(`Finished with code ${code}`);
await this.someMethod();
} else {
console.error(`Exit code is ${code}`);
}
}
);
}
2.删除Loader函数包装,js文件看起来像
console.log(1111);
在组件中:
public doSomething(): void {
fork(
require.resolve('some/path/to/loader.js'),
[ ... some string args here ],
{ env: { 'ELECTRON_RUN_AS_NODE': '1' } }
)
.on(// The same event handling
对于这两种情况,子进程处于生产模式或发布版本均失败,代码为1。放置在Electron的main.ts文件中的相同代码有效。
如何在调用它的位置修复子进程执行?
答案 0 :(得分:0)
您可能要使用WebWorkers。
您可以将一些繁重的代码移交给网络工作者,并保持主线程畅通无阻。
DTYPE = tf.float32
var = tf.Variable(initial_value=1, dtype=DTYPE)
a = tf.TensorArray(dtype=DTYPE, size=10)
a = a.write(0, var)
a_0 = a.read(0)
b = tf.TensorArray(dtype=DTYPE, size=10)
b = b.write(0, a_0 * 3)
b_0 = b.read(0)
b = b.write(1, b_0 * 3)
b_1 = b.read(1)
print(tf.gradients(a_0, var))
print(tf.gradients(b_0, var))
print(tf.gradients(b_0, a_0))
print(tf.gradients(b_1, b_0))
然后
let win = new BrowserWindow({
webPreferences: {
nodeIntegrationInWorker: true
}
})
答案 1 :(得分:0)
如果您在渲染器中,我认为您需要使用remote
类似的东西可能起作用:
const { spawn } = window.remote.require('child_process')
const ls = spawn('ls', ['-lh', '/usr'])
ls.stdout.on('data', (data) => {
console.log(`stdout: ${data}`)
})
ls.stderr.on('data', (data) => {
console.log(`stderr: ${data}`)
})
在上面,您需要将遥控器连接到窗口:
<script>
this.window.remote = require('electron').remote;
</script>