多线程和多进程的区别与联系(待深入思考)

博主文章:https://www.cnblogs.com/D-DZDD/p/7203176.html
最近也是遇到了这个问题,想把pycharm里面的log结果保存到一个文件里面,但是呢我一个文件有两个类,调用Class Logger()时候,文件保存到txt只保存了一些,剩下的只有我退出程序时候才会写进去。所以想到是用多线程问题,等我解决了我截图解释
win下cmd输入dir/s | more
dir/s | more
前面一条命令输出满一页内容到缓冲区,more命令就把缓冲区封死了,等用户敲了一个键显示下一屏的时候,more命令把缓冲区的内容取出并清空,前面的命令才能输出下一屏到缓冲区
也看到了一句话
python中由于某种历史原因,多线程的性能基本可以无视。所以一般情况下python要实现并行操作或者并行计算的时候都是使用多进程。但是 python 中logging 并不支持多进程,所以会遇到不少麻烦

进程——资源分配的最小单位
线程——程序执行的最小单位

还有一篇:https://www.cnblogs.com/yeayee/p/4952022.html


1.理解python中多线程Qthread和threading和Qthread和Qtimer。 参考这几篇文章:
  1. 第一篇
  2. 第二篇
  3. 第三篇
  4. 第四篇
  5. 第五篇
  6. 第六篇
  7. 第七篇
  8. 第八篇
  9. 并发与并行

总结:
1.Qthread解决不了python多线程的GIL的限制

2.GUI界面可以作为主线程,次线程用Qthread执行操作运算,通过重写run,然后用emit来传参进行交互数据,但不是所有数据类型都可以传,如果类型不能传只能写入到文件里面。

3.Qt中的UI操作,比如QMainWindow、QWidget之类的创建、操作,只能位于主线程!
这个限制意味着你不能在新的线程中使用QDialog、QMessageBox等。比如在新线程中复制文件出错,想弹出对话框警告?可以,但是必须将错误信息传到主线程,由主线程实现对话框警告。
因此一般思路是,主线程负责提供界面,子线程负责无UI的单一任务,通过“信号-槽”与主线程交互。

4.相对于 Qt 程序,pyQt 有 GIL,线程越多 UI 线程的时间片就越有限,堵塞的临界点就不一样了。
可你也要考虑 PyQt 和 Qt 的区别,Qt 里面是有真正的并行执行的,两个线程分别占一个 CPU 核、并行执行;这时候 QThread 当然比 QTimer 好 100 倍。
可是 PyQt 里面由于 GIL 的问题,你开了 QThread 它和主线程也只是交替执行的,并没有真正的并行,这时候感觉线程和 QTimer 区别就没那么明显了

5.qtimer 里面长时间 io 操作会卡界面。而线程里不会,等 io 的时候它会让渡控制权。
再比如线程里面对字段或者全局变量的访问需要上锁,因为有调度,qtimer 就不用。
单核上的线程也是线程,不能假设它是严格串行的。

6.我现在的想法是:执行时间短的操作用 QTimer,可以直接操作主线程里的界面元素,方便;执行时间长的操作用线程,不会卡死界面。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值