鱼C论坛

 找回密码
 立即注册
查看: 2123|回复: 14

[已解决]求会多线程的大佬给点思路!感谢

[复制链接]
发表于 2020-8-25 14:43:38 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
QQ截图20200825143546.jpg

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

哪个会卡死?


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-8-28 20:36:42 | 显示全部楼层
疾风怪盗 发表于 2020-8-25 15:07
为什么你有回帖奖励。。。。。。。

这个是随机的,就和中彩票一样,这是我中过最多的,一般是1个2个鱼币
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

不会吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-25 15:42:01 | 显示全部楼层
Twilight6 发表于 2020-8-25 15:35
这就是阻塞界面,你代码运行速度快就不会感觉卡

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


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

我碰到的多进程的问题,我用pyside2做的图形界面,网上找了,说是多进程必须放在if __name__ == "__main__"这里运行,否则就会出现多开卡死的问题,所以改用了多线程,就没事
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 0 反对 1

使用道具 举报

发表于 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()

哪个会卡死?


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-25 15:31:28 | 显示全部楼层
是不是电脑带不起了,还是什么情况,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

不会的吧,我之前做的爬虫也没卡死,只不过运行时不能操作界面,其他程序还是可以运行的,之后做过一个有图形界面的图片识别文字,单进程也就这样,就不过速度慢点,用了多进程,秒开N个进程,那才叫卡死,关也关不掉,改用了多线程才好一点
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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



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

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-25 15:07:55 | 显示全部楼层
zy88888 发表于 2020-8-25 15:02
都玩到多线程了,高手

为什么你有回帖奖励。。。。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-25 15:02:45 | 显示全部楼层

回帖奖励 +25 鱼币

都玩到多线程了,高手
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-25 15:01:16 | 显示全部楼层
如果只是你说的,没必要多线程。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 0 反对 1

使用道具 举报

发表于 2020-8-25 14:52:10 | 显示全部楼层
不用多进程多线程,就单进程运行,也不至于卡死状态吧,只是这个程序需要等操作完再执行其他命令,代码发上来看看,是不是哪里有问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-25 14:48:22 | 显示全部楼层


代码发上来直接帮你改改看~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-19 03:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表