V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
kingmo888
V2EX  ›  问与答

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

  •  
  •   kingmo888 · Sep 27, 2018 · 1270 views
    This topic created in 2780 days ago, the information mentioned may be changed or developed.

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

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

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

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

    求问该如何处理?

    2 replies    2018-09-27 17:46:13 +08:00
    coderluan
        1
    coderluan  
       Sep 27, 2018
    没太看明白楼主为啥这么做,直接用_thread 启动 GUI 线程就不会卡啊,会不会是数据刷新太快,GUI 每条都要显示然后阻塞了爬虫,这种修改下做个数据池缓冲一下就好了,或者干脆修改显示方式也行。
    kingmo888
        2
    kingmo888  
    OP
       Sep 27, 2018
    @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。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1019 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 18:57 · PVG 02:57 · LAX 11:57 · JFK 14:57
    ♥ Do have faith in what you're doing.