Tghao 发表于 2020-8-25 14:43:38

求会多线程的大佬给点思路!感谢



是这样的,我用PySimpleGui 写了一个界面.我想在点击按钮"下载记录"后,后台启动下载脚本,并且下面的控制台能实时输出日志.目前遇到的问题就是点击了"下载记录"程序就处于卡死状态,只能等下载程序跑完,
才会有反应.是因为程序是单线程所导致的吗?有没有大佬能给点思路,
这一块一直没绕明白,感谢了!!{:5_100:} {:5_100:} {:5_100:}

zy88888 发表于 2020-8-28 20:36:42

疾风怪盗 发表于 2020-8-25 15:07
为什么你有回帖奖励。。。。。。。

这个是随机的,就和中彩票一样,这是我中过最多的,一般是1个2个鱼币

永恒的蓝色梦想 发表于 2020-8-26 12:52:47

疾风怪盗 发表于 2020-8-25 15:27
不会的吧,我之前做的爬虫也没卡死,只不过运行时不能操作界面,其他程序还是可以运行的,之后做过一个有 ...

不会吗?

Cool_Breeze 发表于 2020-8-25 19:03:41

本帖最后由 Cool_Breeze 于 2020-8-25 19:10 编辑

https://fishc.com.cn/thread-176988-1-1.html
线程.setDaemon(True)# 主程序退出结束,不然容易造成线程hang

疾风怪盗 发表于 2020-8-25 15:42:01

Twilight6 发表于 2020-8-25 15:35
这就是阻塞界面,你代码运行速度快就不会感觉卡

而且开多进程不需要你说开 N 个,这里只需要将楼 ...

{:5_108:}
还是解决楼主的问题吧,多进程多线程我会的,起码会抄代码

我碰到的多进程的问题,我用pyside2做的图形界面,网上找了,说是多进程必须放在if __name__ == "__main__"这里运行,否则就会出现多开卡死的问题,所以改用了多线程,就没事

Twilight6 发表于 2020-8-25 15:35:59

疾风怪盗 发表于 2020-8-25 15:27
不会的吧,我之前做的爬虫也没卡死,只不过运行时不能操作界面,其他程序还是可以运行的,之后做过一个有 ...



这就是阻塞界面,你代码运行速度快就不会感觉卡

而且开多进程不需要你说开 N 个,这里只需要将楼主下载的那代码开个线程足以

你试试这个代码:

from tkinter import *

def show():
    print('执行程序计算中...')
    i = 100000000
    while i:
      i -= 1
    print(i)


root = Tk()

Button(root,text='执行程序',command = show).pack()

mainloop()

然后试试这个多线程:
from tkinter import *
from threading import Thread

def show():
    def func():
      i = 100000000
      while i:
            i -= 1
      print(i)
    t = Thread(target=func)
    t.start()
    print('执行程序计算中...')

root = Tk()

Button(root,text='执行程序',command = show).pack()

mainloop()

哪个会卡死?


任森 发表于 2020-8-25 15:31:28

是不是电脑带不起了,还是什么情况,

疾风怪盗 发表于 2020-8-25 15:27:04

Twilight6 发表于 2020-8-25 15:14
就是因为单进程会卡死,因为代码执行中 GUI 界面阻塞,必须等待你代码执行结束才会恢复 GUI 运行

不会的吧,我之前做的爬虫也没卡死,只不过运行时不能操作界面,其他程序还是可以运行的,之后做过一个有图形界面的图片识别文字,单进程也就这样,就不过速度慢点,用了多进程,秒开N个进程,那才叫卡死,关也关不掉,改用了多线程才好一点

Twilight6 发表于 2020-8-25 15:14:36

疾风怪盗 发表于 2020-8-25 14:52
不用多进程多线程,就单进程运行,也不至于卡死状态吧,只是这个程序需要等操作完再执行其他命令,代码发上 ...



就是因为单进程会卡死,因为代码执行中 GUI 界面阻塞,必须等待你代码执行结束才会恢复 GUI 运行

疾风怪盗 发表于 2020-8-25 15:07:55

zy88888 发表于 2020-8-25 15:02
都玩到多线程了,高手

为什么你有回帖奖励。。。。。。。{:5_99:}

zy88888 发表于 2020-8-25 15:02:45

都玩到多线程了,高手

yhhpf 发表于 2020-8-25 15:01:16

如果只是你说的,没必要多线程。

疾风怪盗 发表于 2020-8-25 14:52:10

不用多进程多线程,就单进程运行,也不至于卡死状态吧,只是这个程序需要等操作完再执行其他命令,代码发上来看看,是不是哪里有问题

Twilight6 发表于 2020-8-25 14:48:22



代码发上来直接帮你改改看~

xiaosi4081 发表于 2020-8-25 14:44:26

本帖最后由 xiaosi4081 于 2020-8-25 14:46 编辑

import threading
def funcname():
   #你的代码

a = threading.Thread(target=funcname)
a.start()

如果需要参数的话:

import threading
def funcname():
   #你的代码

a = threading.Thread(target=lambda : funcname())
a.start()
页: [1]
查看完整版本: 求会多线程的大佬给点思路!感谢