我用Python3写了一个桌面程序,现在想开一个子进程去处理一些IO操作(比如获取网络上的图片)。

找了很多资料, 比如concurrent.futures,但没发现我要的功能。

我现在的实现,开启子进程后直到子进程结束为止会阻塞父进程,具体表现为GUI卡住了。

请问,我应该找哪方面的资料呢?如果能提供源码更好。

开启子进程(不能阻塞父进程)

子进程完成任务给父进程一个信号,并传递一些参数(比如下载的文件名)

父进程接受信号并显示在主界面上

经大家的指导,已解决,特贴出方案:

# 只贴出关键代码

import ctypes

import win32con

SendMessage = ctypes.windll.user32.SendMessageW

myWM_USER = win32con.WM_USER+10

from concurrent.futures import ProcessPoolExecutor as Pool

pool = Pool(max_workers=1)

def run_proc( hwnd ):

do ... #做一些事情

SendMessage(hwnd, myWM_USER, 0, 0)

# 重载onMessage(不同GUI可能有不同的名称)

def on_message(self, hwnd, msg, wparam, lparam):

if msg == myWM_USER:

print("ok")

def test(self):

pool.submit(run_proc, self.hwnd)

或许有更好的方案~

你找到了很奇怪的地方。没有找过官方文档吗?

子进程 == subprocess,标准库里有这个模块。

不想阻塞就用 subprocess.Popen 创建子进程,但是不等它。要获得完成的通知,使用 signal 模块监听 SIGCHLD 信号。或者你也可以用 os.wait* 里带不阻塞标志的函数来轮询。

扫一扫关注IT屋

微信公众号搜索 “ IT屋 ” ,选择关注与百万开发者在一起

问 题我用Python3写了一个桌面程序,现在想开一个子进程去处理一些IO操作(比如获取网络上的图片)。找了很多资料, 比如concurrent.futures,但没发现我要的功能。我现在的实现,开启子进程后直到子进程结束为止会阻塞父进程,具体表现为GUI卡住了。请问,我应该找哪方面的资料呢?如果能提供源码更好。需求:启动程序开启子进程(不能阻塞父进程)子进程完成任务给父进程一个信号,并传递一些参...
首先说明,Supervisor 只能安装在 Python 2.x 环境中! 但是基本上所有的 Linux 都同时预装了 Python 2.x 和 Python 3.x 版本,并且调用 python 命令时默认 运行 Python 2, 运行 Python 3 只需要 调用 python3 即可。 博主的 CentOS 上预装了 Python 2.7 和 Python 3.5(后升级到了 3.7),并且将 Python 命令默认链接到 Python 3.7。 因此博主的环境是 python : python 3.7 版本 python 2 : python 2.7 版本 pip : pip for
需求:主 线程 开启了多个 线程 去干活,每个 线程 需要 完成 的时间不同,但是在干完活以后都要 通知 给主 线程 下面上代码:#!/usr/bin/ python # coding:utf8 多 线程 和queue配合使用,实现 线程 和主 线程 相互通信的例 import threading __author__ = "Kenny.Li" import Queue import time import r...
def worker(file_info, interval): file_info_cp = file_info this_thread = multiprocessing.current_process() pri...
一般情况下, 进程 会等 子进程 完全结束后再结束,但是守护 进程 是随着 进程 代码结束而结束。而且 子进程 不是一定要依附 进程 执行。那我们如何来证明这个结论呢,下面就用一段代码简单的代码来证明 子进程 ,守护 进程 进程 的关系: #导入Process模块 from multiprocessing import Process #导入time模块 import time #创建一个func...
一、 进程 创建 子进程 ,使用fork(), 一次fork() 两次返回,一次返回的是 进程 自己,一次返回的是 子进程 运行 空间。 二、 进程 必须 监控 子进程 运行 状态,等待 子进程 退出后,使用wait()进行关闭,否则,如果 进程 先退出, 子进程 就没有 亲了,就变成了僵尸 进程 ,此时退出时,就会被系统 进程 init 监控 到,然后由系统 进程 init进行关闭和释放资源。 三、 运行 下列的代码,结果如下:
1. 线程 锁(Lock) Lock(指令锁)是可用的最低级的同步指令。Lock处于锁定状态时,不被特定的 线程 拥有。Lock包含两种状态——锁定和非锁定,以及两个基本的方法。 可以认为Lock有一个锁定池,当 线程 请求锁定时,将 线程 至于池中,直到获得锁定后出池。池中的 线程 处于状态图中的同步阻塞状态。 构造方法: Lock() 实例方法: acquire([timeout]):使 线程
def test_case_08(self): """多用户并发助力""" t1 = [threading.Thread(target=PreheatMethod().help, args=(i, self.A, 1)) for i in self.uid_list] [i.start() fo
1) 子进程 是从 进程 中使用Process生成的,对 子进程 使用os.getppid()可以得到 进程 的pid 2)全局变量在多个 进程 中不能共享,在 子进程 中修改全局变量,对 进程 没有影响
subprocess执行脚本          在执行命令时,在Linux平台,shell=True,否则会报出找不到文件的错误。shell=True,表示采用操作系统命令终端方式处理。 3.2.1 常用函数          函数名:call          定义:subprocess.call(args, *, stdin=None,stdout=None, stderr=None