From ae197b218362ab7049841ef1737750febcb69c1b Mon Sep 17 00:00:00 2001 From: ed Date: Sun, 26 May 2019 19:34:43 +0000 Subject: [PATCH] support winxp --- copyparty/__main__.py | 7 ++++-- copyparty/httpcli.py | 2 +- copyparty/mpsrv.py | 7 ++++-- copyparty/tcpsrv.py | 57 +++++++++++++++++++++++++++++++++++++------ 4 files changed, 61 insertions(+), 12 deletions(-) diff --git a/copyparty/__main__.py b/copyparty/__main__.py index ee2e2dde..40bb947a 100644 --- a/copyparty/__main__.py +++ b/copyparty/__main__.py @@ -86,8 +86,11 @@ def main(): thr.daemon = True thr.start() - while True: - time.sleep(9001) + try: + while True: + time.sleep(9001) + except: + print("bye") if __name__ == "__main__": diff --git a/copyparty/httpcli.py b/copyparty/httpcli.py index b76ca3ba..efc44d24 100644 --- a/copyparty/httpcli.py +++ b/copyparty/httpcli.py @@ -121,7 +121,7 @@ class HttpCli(object): for ln in form_segm[1:]: self.log(ln) - fn = "/dev/null" + fn = os.devnull fn0 = "inc.{0:.6f}".format(time.time()) files = [] diff --git a/copyparty/mpsrv.py b/copyparty/mpsrv.py index 58c2a495..cec7eb3e 100644 --- a/copyparty/mpsrv.py +++ b/copyparty/mpsrv.py @@ -37,8 +37,11 @@ class MpWorker(object): thr.daemon = True thr.start() - while True: - time.sleep(9001) + try: + while True: + time.sleep(9001) + except: + self.logw("bye") def log(self, src, msg): self.q_yield.put(["log", src, msg]) diff --git a/copyparty/tcpsrv.py b/copyparty/tcpsrv.py index a71a8f9c..71089dad 100644 --- a/copyparty/tcpsrv.py +++ b/copyparty/tcpsrv.py @@ -8,8 +8,8 @@ import threading from datetime import datetime, timedelta import calendar +from .__init__ import * from .msgsvc import * -from .mpsrv import * class TcpSrv(object): @@ -20,6 +20,8 @@ class TcpSrv(object): """ def __init__(self, args): + self.args = args + self.log_mutex = threading.Lock() self.msgsvc = MsgSvc(self.log) self.next_day = 0 @@ -46,12 +48,7 @@ class TcpSrv(object): self.log("root", "listening @ {0}:{1}".format(bind_ip, bind_port)) - if args.j == 0: - self.log("root", "multiprocessing disabled") - httpsrv = HttpSrv(args, self.log) - else: - httpsrv = MpSrv(args, self.log) - + httpsrv = self.create_server() while True: if httpsrv.num_clients() >= args.nc: time.sleep(0.1) @@ -60,6 +57,52 @@ class TcpSrv(object): sck, addr = srv.accept() httpsrv.accept(sck, addr) + def check_mp_support(self): + vmin = sys.version_info[1] + if WINDOWS: + if PY2: + # ForkingPickler doesn't support winsock + return False + elif vmin < 4: + return False + else: + if not PY2 and vmin < 4: + return False + + try: + # fails on py3.3, works on py2.7 + from multiprocessing.reduction import ForkingPickler + except: + return False + + return True + + def create_server(self): + if self.args.j == 0: + self.log("root", "multiprocessing disabled by argument -j 0;") + return self.create_threading_server() + + if not self.check_mp_support(): + if WINDOWS: + self.log("root", "need python 3.4 or newer for multiprocessing;") + else: + self.log("root", "need python 2.7 or 3.4+ for multiprocessing;") + + return self.create_threading_server() + + return self.create_multiprocessing_server() + + def create_threading_server(self): + from .httpsrv import HttpSrv + + self.log("root", "cannot efficiently use multiple CPU cores") + return HttpSrv(self.args, self.log) + + def create_multiprocessing_server(self): + from .mpsrv import MpSrv + + return MpSrv(self.args, self.log) + def log(self, src, msg): now = time.time() if now >= self.next_day: