Get piping working on windows as well

This commit is contained in:
Kovid Goyal 2020-11-30 13:39:51 +05:30
parent 35cbca3dad
commit 064c66804b
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
4 changed files with 50 additions and 20 deletions

View File

@ -187,9 +187,19 @@ class Worker:
args['stderr'] = subprocess.STDOUT args['stderr'] = subprocess.STDOUT
args['close_fds'] = True args['close_fds'] = True
if pass_fds: try:
args['pass_fds'] = pass_fds if pass_fds:
self.child = subprocess.Popen(cmd, **args) if iswindows:
for fd in pass_fds:
os.set_handle_inheritable(fd, True)
args['startupinfo'] = subprocess.STARTUPINFO(lpAttributeList={'handle_list':pass_fds})
else:
args['pass_fds'] = pass_fds
self.child = subprocess.Popen(cmd, **args)
finally:
if iswindows and pass_fds:
for fd in pass_fds:
os.set_handle_inheritable(fd, False)
if 'stdin' in args: if 'stdin' in args:
self.child.stdin.close() self.child.stdin.close()

View File

@ -387,7 +387,10 @@ def worker_main(conn):
def run_main(client_fd, func): def run_main(client_fd, func):
from multiprocessing.connection import Connection if iswindows:
from multiprocessing.connection import PipeConnection as Connection
else:
from multiprocessing.connection import Connection
with Connection(client_fd) as conn: with Connection(client_fd) as conn:
raise SystemExit(func(conn)) raise SystemExit(func(conn))

View File

@ -146,19 +146,30 @@ def start_pipe_worker(command, env=None, priority='normal', **process_args):
w = Worker(env or {}) w = Worker(env or {})
args = {'stdout':subprocess.PIPE, 'stdin':subprocess.PIPE, 'env':w.env, 'close_fds': True} args = {'stdout':subprocess.PIPE, 'stdin':subprocess.PIPE, 'env':w.env, 'close_fds': True}
args.update(process_args) args.update(process_args)
if iswindows: pass_fds = None
priority = { try:
'high' : subprocess.HIGH_PRIORITY_CLASS, if iswindows:
'normal' : subprocess.NORMAL_PRIORITY_CLASS, priority = {
'low' : subprocess.IDLE_PRIORITY_CLASS}[priority] 'high' : subprocess.HIGH_PRIORITY_CLASS,
args['creationflags'] = subprocess.CREATE_NO_WINDOW|priority 'normal' : subprocess.NORMAL_PRIORITY_CLASS,
else: 'low' : subprocess.IDLE_PRIORITY_CLASS}[priority]
niceness = {'normal' : 0, 'low' : 10, 'high' : 20}[priority] args['creationflags'] = subprocess.CREATE_NO_WINDOW|priority
args['env']['CALIBRE_WORKER_NICENESS'] = str(niceness) pass_fds = args.pop('pass_fds', None)
if pass_fds:
for fd in pass_fds:
os.set_handle_inheritable(fd, True)
args['startupinfo'] = subprocess.STARTUPINFO(lpAttributeList={'handle_list':pass_fds})
else:
niceness = {'normal' : 0, 'low' : 10, 'high' : 20}[priority]
args['env']['CALIBRE_WORKER_NICENESS'] = str(niceness)
exe = w.executable exe = w.executable
cmd = [exe] if isinstance(exe, string_or_bytes) else exe cmd = [exe] if isinstance(exe, string_or_bytes) else exe
p = subprocess.Popen(cmd + ['--pipe-worker', command], **args) p = subprocess.Popen(cmd + ['--pipe-worker', command], **args)
finally:
if iswindows and pass_fds:
for fd in pass_fds:
os.set_handle_inheritable(fd, False)
return p return p

View File

@ -6,17 +6,23 @@ __license__ = 'GPL v3'
__copyright__ = '2009, Kovid Goyal <kovid@kovidgoyal.net>' __copyright__ = '2009, Kovid Goyal <kovid@kovidgoyal.net>'
__docformat__ = 'restructuredtext en' __docformat__ = 'restructuredtext en'
import os, sys, importlib import importlib
from multiprocessing.connection import Connection import os
import sys
from threading import Thread from threading import Thread
from zipimport import ZipImportError from zipimport import ZipImportError
from calibre import prints from calibre import prints
from calibre.constants import iswindows, ismacos from calibre.constants import ismacos, iswindows
from calibre.utils.ipc import eintr_retry_call from calibre.utils.ipc import eintr_retry_call
from calibre.utils.serialize import pickle_dumps from calibre.utils.serialize import pickle_dumps
from polyglot.queue import Queue
from polyglot.binary import from_hex_unicode from polyglot.binary import from_hex_unicode
from polyglot.queue import Queue
if iswindows:
from multiprocessing.connection import PipeConnection as Connection
else:
from multiprocessing.connection import Connection
PARALLEL_FUNCS = { PARALLEL_FUNCS = {
'lrfviewer' : 'lrfviewer' :