V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
kingmo888
V2EX  ›  问与答

求助个 pyqt 小白问题/疑问,如何 GUI 不卡的情况下实现多线程?

  •  
  •   kingmo888 · 2018-09-27 17:14:26 +08:00 · 967 次点击
    这是一个创建于 2252 天前的主题,其中的信息可能已经有所发展或是发生改变。

    看到网上的资料,一般当子函数逻辑是无限循环的时候, 会以 QtCore.QThread 的方式来执行,以实现更新 GUI,且 GUI 不卡。

    我的有一个多线程爬虫的脚本,想要给他实现一个 GUI 界面出来。

    现在实现的是 一个类继承 QtCore.QThread,这个类中分配线程数、实现 queue,然后发给 spider 类(该类继承 threading.Thread )

    这样处理后,GUI 倒是不卡。但是效率明显下来了,给人的感觉就是实际上是单线程在运行(或许真是如此)。

    求问该如何处理?

    2 条回复    2018-09-27 17:46:13 +08:00
    coderluan
        1
    coderluan  
       2018-09-27 17:33:08 +08:00
    没太看明白楼主为啥这么做,直接用_thread 启动 GUI 线程就不会卡啊,会不会是数据刷新太快,GUI 每条都要显示然后阻塞了爬虫,这种修改下做个数据池缓冲一下就好了,或者干脆修改显示方式也行。
    kingmo888
        2
    kingmo888  
    OP
       2018-09-27 17:46:13 +08:00
    @coderluan
    比如不用 GUI 前的结构是:

    spider(threading.Thread)

    Down:

    def __init__(threadnum, needDeal):

    queue()

    for i in range(len(needDeal):

    queue.put()

    for i in range(threadnum):

    t = spider(......)

    t.setDaemon(True)

    t.start()

    queue.join()



    后来加个 GUI 上去,
    就把 Down 改为 Down(QThread), 其中 init 的代码转移到了 run()中。

    然后在 GUI 代码中调用 Down。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3727 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 10:36 · PVG 18:36 · LAX 02:36 · JFK 05:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.