From 0ccd4ee97c42825365c61db15348ed52319bd469 Mon Sep 17 00:00:00 2001 From: milk <53408947@qq.com> Date: Mon, 3 Nov 2025 14:27:31 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=B4=E6=97=B6=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Module/DeviceInfo.py | 15 +++++++++++++++ Module/FlaskSubprocessManager.py | 6 +++++- Module/Main.py | 2 +- Module/__pycache__/DeviceInfo.cpython-312.pyc | Bin 30541 -> 31220 bytes .../FlaskSubprocessManager.cpython-312.pyc | Bin 13260 -> 13518 bytes Module/__pycache__/Main.cpython-312.pyc | Bin 3763 -> 3763 bytes Utils/LogManager.py | 2 +- .../__pycache__/ControlUtils.cpython-312.pyc | Bin 13101 -> 13124 bytes Utils/__pycache__/LogManager.cpython-312.pyc | Bin 14663 -> 14663 bytes .../__pycache__/ScriptManager.cpython-312.pyc | Bin 69569 -> 69870 bytes 10 files changed, 22 insertions(+), 3 deletions(-) diff --git a/Module/DeviceInfo.py b/Module/DeviceInfo.py index e4ee4f3..c5e4cac 100644 --- a/Module/DeviceInfo.py +++ b/Module/DeviceInfo.py @@ -71,6 +71,17 @@ def _pick_free_port(low: int = 20000, high: int = 48000) -> int: class DeviceInfo: + _instance = None + _instance_lock = threading.Lock() + + def __new__(cls, *args, **kwargs): + # 双重检查锁,确保线程安全单例 + if not cls._instance: + with cls._instance_lock: + if not cls._instance: + cls._instance = super().__new__(cls) + return cls._instance + # ---- 端口分配:加一个最小的“保留池”,避免并发选到同一个端口 ---- def _alloc_port(self) -> int: with self._lock: @@ -105,6 +116,10 @@ class DeviceInfo: WDA_READY_TIMEOUT = float(os.getenv("WDA_READY_TIMEOUT", "35.0")) def __init__(self) -> None: + # 防止多次初始化(因为 __init__ 每次调用 DeviceInfo() 都会执行) + if getattr(self, "_initialized", False): + return + self._lock = threading.RLock() self._models: Dict[str, DeviceModel] = {} self._iproxy: Dict[str, subprocess.Popen] = {} diff --git a/Module/FlaskSubprocessManager.py b/Module/FlaskSubprocessManager.py index ef77105..94b83be 100644 --- a/Module/FlaskSubprocessManager.py +++ b/Module/FlaskSubprocessManager.py @@ -10,7 +10,6 @@ from pathlib import Path from typing import Optional, Union, Dict, List import psutil - from Utils.LogManager import LogManager @@ -173,6 +172,11 @@ class FlaskSubprocessManager: self.stop() try: self.start() + from Module.DeviceInfo import DeviceInfo + # 重新发送设备相关数据到flask + info = DeviceInfo() + for model in info._models.keys(): + self.send(model) except Exception as e: LogManager.error(f"自动重启失败:{e}", udid="system") time.sleep(2) diff --git a/Module/Main.py b/Module/Main.py index 92de576..11b32b7 100644 --- a/Module/Main.py +++ b/Module/Main.py @@ -50,7 +50,7 @@ if __name__ == "__main__": # 清空日志 LogManager.clearLogs() - main(sys.argv) + # main(sys.argv) # 添加iOS开发包到电脑上 deployer = DevDiskImageDeployer(verbose=True) diff --git a/Module/__pycache__/DeviceInfo.cpython-312.pyc b/Module/__pycache__/DeviceInfo.cpython-312.pyc index 7460619fec86cb218b31d2066d8ad8923b1a5d48..0fc3ecf0ab9f73e22134be2b91cf0ff46d5ca5bb 100644 GIT binary patch delta 4091 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 delta 3402 zcmZ`)YitzP6`nggJ6?Oe#>VRxYkQ3!#oJ&PlF+meV_U^BCIqkn$FhO-vUj{5d%e5d zne{6uCc;TbL#0$#D2dXNS0AC62y3ENO`23`s?daoRFxm;BqFUKLXfm66ty&Inx1pV zYn!SWYd@bk_ndprqDl>JqX7vRjrk6@FQKpH@`irs{F8D<*Upc zYn3hs>maTEicK9Wnbv?+6|L2lLoMn+u7)tME?)z=X2Kh4uyYDFXrp>m>qrbF*;0rk zN_d3&tuK~X3c1&s_3xL9?*TRI0I;*DZbT!DhGe#hf2X90MEOG{hshRxA+?r25%>7^ zOW`>lNRrNnN<*^g5GaSKv9>zY|pVe3rfX_PZKa!Qbj*gbnf&mBUc4vY@_v6Ydj0=tdX> zu$5>sk+2n}87Vf(Uku(y9}vt0KzhaT>y5Dp_x=0h@|5t+l^X55>cRDTvvv*3Bz{9G?Q)PHyeVz z51~;f!ovWe9ERcAuC%e&Ce&7wiMXE77zS>;63H=}q;2;w2nkUmTZu;u)5wA4OiEQ% zPEwEaeT~KBHS190DfbF&$mO$V@cDN$i;Lab+je}G^$o*}m}!HxfePw7dgsCIT_}o- z7)l0$iI4`sPDH4k1qnneENo~A8p@qZmS1dXEI$MW2HwksK4dy^gg3MX2(da^ zpHi1S2qss)gooikV22TYj_@k~yuD*e)KhRq(8ZNXrWOJa6ce?}aYy{H=)A3KjAE`b{)5vfBK`S^gC?%;aWwcp6lXKIZ~{RP+qvd^`SyzT`7*E%aAS`-k_xAi%ybI-2Xxtoa4Xf> zNz^$^N9iM=dq8Gy^B1<)6K0*>zDps$qW`M)q5Kaos&TdDGMENuGGt*H534B zqSM27_+ve_Prt1G8vS45{=RRK!~DL!`gLOK)u{ay!s`IGdmx^SnCuNyV5*A= zW0R<@82Tj49)7a#+vJ#awJ#`>k9p3XXFNC1SZ3Gxi9Kb`eC_6E_H>e0d1ZJbxu3_v zcSNtCjmmo9pY3iN)eXP_A{-*GSS$JyviBEg_-BM+{@h-pS>(G=K-D=#d|dDpTQ-vni^%E$3>5&k&eZY} z?~2xuQ+zynk$h64_->=J82e;Q7ORLf7AbyMQXh)E+p5ud^eyB*;U zgl!0&2;!?5LkZad2PBhmHi_>V!s7_D2uBcb-m*6l#6^DxrRxaqB8UdNQSz=rF6AQ# z5}ZaQmYI1Guo$c#p#-56fS*kJJy*eDTKb#9KS~d%K6fj*R%LaLrb*!q$?I+scB~bQ zA=P32$FVxK2i?6~8E+~o#>2#H+=t5FAbi5R$6qNDxr^zv8kOP}tm46mm1G^?Jn{6B Nty!e$x`ZfB_%C;)Qa%6x diff --git a/Module/__pycache__/FlaskSubprocessManager.cpython-312.pyc b/Module/__pycache__/FlaskSubprocessManager.cpython-312.pyc index ccf64c6d6b23637c6409f210a7f9c9e142efcd09..5eb7486359f080137cc6dc762a30d892ceca1424 100644 GIT binary patch delta 777 zcmYjP%}*0S6rZTz-Oqe)Ya}n1K!Zh5Q*%ri?*6!l(C@<3*1n0GagxG=SVFfD(|T0CgZBE7O0I z?m$U!qdsA$QWa7Tr5SB9M?s1iLlab#dP!%goyvXg9VIT_V-}JW%;_qDjqGMWhmN=Id(fsc|i6FmVh7#cv-B~ zJ=X{$V2}pGe2Ht#Y#D8R*!t+?x;gaA<{1l(MAn?1*~;n4RcG*~JhD>aH*_xIj|ky84D_gGQHjuuMUh)uU(=bHt3!B^jG zqZe&#v!Lp#&jQTg^EIt7ug=z-18$t8-g4o9-+~>rdU&f=*WLls3&I|kXl0ssMUyDc z@SD0eSX2%59B>ocG_LR;hGl%lKM!AVVc<2VeH~>SF9%%k3U37Jpcp%X3ATiFZHRa@ uco(Lzwc(U?PLp{xFcbJ&5F(F7-u|fa4&Q5NG_NDyAFheqaSLgp~eva delta 513 zcmX??c_y9jG%qg~0}wnp&6sJfu#xXFGo$F{N6ghsj53?!*silMs%?gdNDCDOrLD1t2kMKmv8cVRa4dlH4IstlLIBC zSc;2F7$+M_%1l;PJHc2pxlmhla;>@|4u2JbgzkCQ+z(~Pwv)IVC0&-M$1%P1*qttnz^$G^C2|>X9b4CBCO7`?1vRN zU6hy)YwEkmG9Qs;by3>PsU5-y^j@5f7vt8=D|Mn6*=7TERw+&9;g;Yo$S*31Pt3_I zOWn0uN3VfVcp*^EO_RB3E|4w)DJ+^ddB46dK2WtV$o`CeJi(Vw^i!#>Ag-&Ey;t3C3NM aTTM(wo-(L^XRBpm6#c{iB8$|3MgRcOu8vdy diff --git a/Module/__pycache__/Main.cpython-312.pyc b/Module/__pycache__/Main.cpython-312.pyc index c670ff135faa0d9dee381486633921d641675c7b..686ac3996338713937f574faac917bc7c48f4c3a 100644 GIT binary patch delta 20 acmdliyIGd|G%qg~0}x2taBSpW!3O{{wghYd delta 20 acmdliyIGd|G%qg~0}zxaFmL2u!3O{~`2^I(TqlWTaT zHp}teV3g42lzbp8HQjci?FSYvLDA2wydr!ZE+6DJ^YQ;>V$9jhBlL`sv1;>Y;ao<> z_RWc+H<=kHZnl<8U}apld5+vg7RFPX^OV1`F@E2iqV<-M@$u#$odZma3Y&%XnHU+> zHj5c>GK%T2N-kjg!~mo|Gc&LWeqaK!KE!P{HGIw}7|Ft@Gr{aD1Bfot2f7^q+x0$7 delta 180 zcmX?-wlN@#IPJ`k3gZadNT0}H31 z=x0_Q5xx$W4>Fro`TsI8W^Yy&ddA3DxtU8Omyxk;bA{+lX2uDdgCrAJ8P{&!EO(KG z@#N-K<*#gv-!@lky=7#4v^i7f028D9W-WatMn=`mx(1w#V%n^d3)ns}0IAQ+3~YiQ en1HMgF`Io1pEC+ZurTUOF#E~?qKou_&IACU=4?^#uI@ delta 20 acmX?Jbi9cBG%qg~0}zxaFmL3xu>=4`I0bkB diff --git a/script/__pycache__/ScriptManager.cpython-312.pyc b/script/__pycache__/ScriptManager.cpython-312.pyc index 402a034da4c1b9f77fc640f51ec133227f72bd11..2585a6e99b9c797962b4dd4806f2145fd60a911c 100644 GIT binary patch delta 1595 zcmZXU4@{J09LL|^``*3Y0rv;EJGeW!yFkGU1`>i;TZll*<*F@n1}>nb&)+oA zyY7!5oVIUHVBA)^jyA-_2|@tlcv`e&9CY+K&s~kKLzu0=^3XHVurdv;+-euJ0UedL zo|#wUMP&p@3TWuy9)qb$8DJA!2A82j`M&~Ltaxsj8A6R1T)fNZ`A>ga)9ATQYm#bS z|E4NcGuO)hy9$58Y*~(@O{Mx$T7JJft==*Y>@(??T= z>OLRYdm<oq$Y#H)Ja0d-qqTWq)K z(LR0hb!*ZUYx*T?`iZ1o>*Eco!5I5hgSp$1*=NYQYDwr`l+$Zj*=<<)i@ao;N`&8N z`u4NRrR*@x(A?J5a`ui>o|uTTf@uARc>WMUKkf0E2T81>`$G{598F@`ief4 z?Yc_StB11zTQgNNW*S=nR){ViP8ZNwO2oF+G$ zT@x%^OYWdBiTEAy2O=497cqsnhxik5A2EY?z)%^*Fw)#Oy!V69hP*xeS^aR$r{p0{ z;MnPRCey|a3te8BwVMDN6Wme4V9;NM;Gox9QX!s3wkATBoZVWa zfoXaFu~h(3w7+8mtdLiHY_l<~@ItewbFjn#!Q~+XyvIxIGJnYiV5g7t6vLQY+w%ku z%jwsBM#z>g_bGWX^dAUx@bY}Vrx3fe)* zdWoi8!DyJKgTZdtL{Htw;6;&+-1r&N==qy3@M=+B`0H*x2()E-4ZK8y(`&^|Siw#6 zW_*jcV3%T<&rdwBIf0<#V;{~z@H!C>i+80;7X`4=)Q90}Zv`pe;NRhYg@!%oT3E_l z;=*}lEOIJHISO7x8ol%28Q4g39{wc0g+lF_c+m33(B9&`B?YL4Du7hLLml{}E*=uX z@h3?QVwZHEhXOUG4}h1{N~;C1LA10*fEtMIydl6B3)U`WZsPT6nw3dg)#`BtxgPI0C-WC!ijWSb~U>rXnED5;~cW z;p|Yq6==01j!0=5C>2YU%FK!NQkw=U;loao7IFd3N`*QojPzLGX_(+bU&O*n`~~x{ BusHw# delta 1337 zcmZXUZ%i9?7{~9q>m4m{*D}iAjgEE5tiz%Mw-^(JF>p8|iLh+bEfr}gh0?NL3me9{ z!6dGUiPI-|3j-$6#3h8xiXikWx)28n(B+5G|7;Kv>8%nT+?9zB zn$Lm_M}iwU54P6PQzoZPANU1 zqTYI8b*Iu)wkeU;x_PB)HQ$sIJm2s1J4faJ_1wzmRfhBU9zEf8mgKOJU;&o57iMMo z9f?(IbPL^rCmTcUpWzFUa>&J_k(k{~iyaDe1bi$MY>9g`l%h|%Kj1^yNy2-CVnQ{c zh9jnNU@+PQK4T*4745HpkdgDf!+p)+zUe5MH0qgEff?L?_)FQ#&v+3d!?i|J_is|# z)9Ttef#d#RF!mm4mfcaCkeREOykGL6ccH^3*t8STn^xB^R`se@_N}%2!9u|Jxpz^7 zeB-CS&z(?&I4}%5j4h|Lq4q8n=s#xr8hR?4t9MI&7S7Hf=$q7h%n&$b!Tce1D?4?#q2^0KmWtHuwL zhp0il*~I6Kn{L==nC7%y@zH*-;pN-w!GhDbi(wwMJ6FMvx9*gQ4`p=D+yXBy%+!m^ zvQc~Yr~^d&X7NR+!|bI7#ZT1%>{yCD5~O{Ua4gP39Ufp5iSe&c$nxlHTDbj&x4#04 z(YtJg2HduMWnC*5nV-UK-11mhn1ptMx4#f}!Jhsw{HXMjaD2QDKohe>a%@zygREo= zL1z-Y15E#0f{kf3iX9_#>yKKX+D7#zMA&h?%K|P~qxV~&2W;axGF(h)DCN;kYB+@_ zRz6Im_D@iUat@EeEF@Htu$@pvF1?Ic6~!$p&)Xgf(euXk>BTB+hB5tR6)rvRCVc~8 z6Cs1cw8dLkpwSz?{mQ33|~I%gn1$P!}58He*wN4WRCy<