gxqcn 发表于 2020-4-15 08:18:43

大整数算法,可能会有耗时很长的计算,为了不影响用户的 UI 操作,
请教大家:比较好的解决方案,是用多线程?还是多进程?

用前者的话,算法库里得经常查看一个bool变量,来决定是否终止计算,有性能损耗;
用后者的话,算法库内部设计会更单纯,但调用者需处理数据传输等,门槛会比较高。

风云剑 发表于 2020-4-15 12:46:41

我比较倾向多进程。但要终止计算不也需要查个标志变量吗?难道直接结束进程?
多进程就比较灵活了,算法库是独立的,都不一定要和GUI部署到一个电脑上,以后要扩展分布计算也相对容易。
输入输出用就cin,cout,加个telnet外壳还可以远程使用。

.·.·. 发表于 2020-4-15 14:36:53

gxqcn 发表于 2020-4-15 08:18
大整数算法,可能会有耗时很长的计算,为了不影响用户的 UI 操作,
请教大家:比较好的解决方案,是用多线 ...

为啥多线程反而会有性能损耗呢?
又不是python……

我看过的不少程序都是多线程(本地)+多进程(集群)的架构

gxqcn 发表于 2020-4-15 16:50:38

为了防止用户 UI 假死,或者为了用户可以在计算中途能 Cancel,
就不能把 UI 线程与工作线程合并成一个线程。

如果是用多线程处理,
工作线程可以接收到 UI 线程下达的取消当前计算的命令,
算法库为了响应该指令,它就得时不时查询一下某个变量,看是否下达了该指令。

如果是用多进程处理,
当用户想取消当前的计算,只要把工作进程枪毙掉即可,
算法库设计会很单纯,无需检查是否需提前退出,闷着头干活就对了。

【背景资料】
昨天,将半成品给公司的技术总监(也是位大牛)演示交流了下,
针对UI 防假死问题,他建议我用多进程,说好处多多,
而我还没有多进程开发的经验,甚至很少写带 UI 的应用程序,
所以才把这个话题抛出来,让大家讨论讨论,
毕竟开发出的算法库,初衷是分享给大家用的,
若仅仅是我自己一个人关着门写着玩,那 UI 是非必需的,多线程/多进程也是非必需的。

如果通过多进程,可以保证用户的 UI 不会假死,那我会考虑学习一下多进程的开发。

风云剑 发表于 2020-4-15 17:41:25

多进程肯定可以保证UI不假死,但一般这个UI本身需要多线程,即有一个线程专门负责和算法库去通信,再有一个线程负责和用户交互。
进程间通信的方式就很多了,最简单的就是标准IO重定向,算法库用cin接收输入,cout输出就行了。
要说缺点也是有的,就是输入输出这块比较复杂,不像函数调用那样直接了。输入输出信息非常多的时候可能会比较慢。

wayne 发表于 2020-4-15 17:59:14

gxqcn 发表于 2020-4-15 08:18.
用前者的话,算法库里得经常查看一个bool变量,来决定是否终止计算,有性能损耗;
用后者的话,算法库内部设计会更单纯,但调用者需处理数据传输等,门槛会比较高。
1) 如无特别的需求,基本上都是选择多线程的. 因为多线程比多进程的总资源开销要低很多.   
            [除非某些特别的原因才会选择多进程, 比如 子任务可能会崩溃,导致主线程[整个软件]也崩溃. 如果要求软件无论如何也不能崩溃,即便是算法库崩了,软件也不能崩,那么只能是多进程了.]
2) 算法库是属于计算密集型的任务, 然后算法结果的后期处理与输出是属于IO类型的任务.把计算和IO处理分开是推荐做法.
3) UI 是属于IO类型的, 主线程 是一个总的IO事件处理器 就可以了. 然后计算任务与IO事件处理器之间的通信通常走的是消息信号, 在此我个人 强烈推荐用Qt这种 异步风格的GUI. 支持几乎所有的平台,而且社区太成熟了

无心人 发表于 2020-4-23 20:20:15

应该是既不是多进程,也不是多线程,而是轻量级异步

灵树 发表于 2020-4-24 17:52:59

一般比较耗时的操作都会另起一个线程,这样UI操作基本不受影响。还可以随时控制进度,比如cancel。看情形你是把UI和计算混一块写了,比较好的做法是把计算功能独立出来写,UI将来可以随便换成什么都可以。方法通用,操作简单,容易移植。

gxqcn 发表于 2020-4-24 18:42:46

错!我的计算部分是独立的DLL,现在用的是独立的线程(内部还有个线程池),UI 是另一个线程,可随时 cancel
要讨论的是调用算法库部分,是用独立的线程,还是独立的进程?前者对调用者简单,后者对库开发者简单。

灵树 发表于 2020-4-24 21:30:32

这个当然是线程了,创建一个线程要比创建过程要快很多。开发出来是为了让别人用而不是自己玩。
页: 1 2 3 4 5 6 7 8 [9] 10 11 12
查看完整版本: 重启大整数库 HugeCalc 的研发工作