Skip to content

多进程报错 #50

Closed
Closed
@kingmo888

Description

@kingmo888

根据#21@myd7349提供的方法,可以解决不会N个进程弹出N个GUI了。
但是当子进程结束任务时,就会N个(pool数)下列错误,当确定后,主进程继续往下走。
image

多进程采用的进程池pool.apply_async的方式。

如果采用bat调用runtime\python.exe方式启动没有任何错误,采用pystand.exe方式启动就会有上述错误。

经过检查,子进程退出时将会跳转到muitlprocessing\spawn.py::spawn_main中执行sys.exit,从而引发截图Error。

========================
以下脚本将复现sys.exit(0)引起的Error:

import sys
import os


text = '''
import sys
sys.exit(0)
'''

PYSTAND_SCRIPT = '123.int'


def MessageBox(msg, info = 'Message'):
    import ctypes
    ctypes.windll.user32.MessageBoxW(None, str(msg), str(info), 0)
    return 0
os.MessageBox = MessageBox

#ifndef PYSTAND_CONSOLE
try:
    fd = os.open('CONOUT$', os.O_RDWR | os.O_BINARY)
    fp = os.fdopen(fd, 'w')
    sys.stdout = fp
    sys.stderr = fp
except Exception:
    fp = open(os.devnull, 'w')
    sys.stdout = fp
    sys.stderr = fp



environ = {'__file__': PYSTAND_SCRIPT, '__name__': '__main__'}
environ['__package__'] = None

#ifndef PYSTAND_CONSOLE
try:
    code = compile(text, PYSTAND_SCRIPT, 'exec')
    exec(code, environ)
except:
    import traceback, io
    sio = io.StringIO()
    traceback.print_exc(file = sio)
    os.MessageBox(sio.getvalue(), 'Error')

#else
code = compile(text, PYSTAND_SCRIPT, 'exec')
exec(code, environ)

查阅资料,sys.exit(0)会被捕捉,推荐使用os._exit(0),但在本例中就需要修改py自带的multiprocessing包了,不是太好。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions