我用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