处理线程问题

This commit is contained in:
limil 2024-10-27 22:06:24 +08:00
parent 3f79bff3ea
commit 7922c9d89a
2 changed files with 40 additions and 10 deletions

48
main.py
View File

@ -7,11 +7,21 @@ import colorlog
from pikpakFs import VirtFsNode, DirNode, FileNode, PKVirtFs
import os
def RunSync(func):
@wraps(func)
def decorated(*args, **kwargs):
return asyncio.get_event_loop().run_until_complete(func(*args, **kwargs))
return decorated
def RunSyncInLoop(loop):
def decorator(func):
@wraps(func)
def decorated(*args, **kwargs):
currentLoop = None
try:
currentLoop = asyncio.get_running_loop()
except RuntimeError:
pass
if currentLoop is loop:
return loop.run_until_complete(func(*args, **kwargs))
else:
return asyncio.run_coroutine_threadsafe(func(*args, **kwargs), loop).result()
return decorated
return decorator
def ProvideDecoratorSelfArgs(decorator, argsProvider):
def wrapper(func):
@ -51,7 +61,13 @@ class PikpakConsole(cmd2.Cmd):
self._SetupLogging()
self.client = PKVirtFs("token.json", proxy="http://127.0.0.1:7897")
async def Run(self):
async def Run(self):
import signal
def signal_handler(sig, frame):
pass
signal.signal(signal.SIGINT, signal_handler)
self.loop = asyncio.get_running_loop()
saved_readline_settings = None
try:
# Get sigint protection while we set up readline for cmd2
@ -84,6 +100,12 @@ class PikpakConsole(cmd2.Cmd):
logging.getLogger().setLevel(logging.INFO)
logging.info("Debug mode disabled")
def LoopProvider(self):
return self.loop
RunSync = ProvideDecoratorSelfArgs(RunSyncInLoop, LoopProvider)
login_parser = cmd2.Cmd2ArgumentParser()
login_parser.add_argument("username", help="username", nargs="?")
login_parser.add_argument("password", help="password", nargs="?")
@ -98,7 +120,7 @@ class PikpakConsole(cmd2.Cmd):
await aprint("Logged in successfully")
def PathParserProvider(self):
@RunSync
@RunSyncInLoop(self.loop)
async def PathToNode(path):
path = await self.client.PathToNode(path)
if path is None:
@ -184,8 +206,16 @@ class PikpakConsole(cmd2.Cmd):
"""
os.system('cls' if os.name == 'nt' else 'clear')
def complete_rm(self, text, line, begidx, endidx):
return self.PathCompleter(text, line, begidx, endidx, filterFiles = False)
if __name__ == "__main__":
@RunSync
@WithPathParser
async def do_rm(self, args):
await self.client.Delete(args.path)
if __name__ == "__main__":
nest_asyncio.apply()
prog = PikpakConsole()
asyncio.run(prog.Run())
asyncio.run(prog.Run())

View File

@ -240,7 +240,7 @@ class PKVirtFs:
result = await self.client.get_download_url(file.id)
file.url = result["web_content_link"]
async def Download(self, url : str, dirNode : DirNode = None) -> None :
async def Download(self, url : str, dirNode : DirNode) -> None :
# 默认创建在当前目录下
# todo: 完善离线下载task相关
if dirNode is None: