我们知道,Python的多线程,其实不是真正的并发。
他是以极快的速度,在多个线程中来回切换。
于是,我最近面临一个问题:一个程序要同时测试多台设备,要怎么进行真正的并发,从而使多台设备的运行时间与一台设备一致。
我想到了同时运行多个Python。呵呵。于是调用cmd的start,进行‘并发’操作。
程序的检测思路是:
通过batch脚本,将文件夹下的各个设备配置读取出来,然后没有设备配置都启动一个start去调用。
于是,实现多个设备同时检测。
for /r %1 %%v in (original*) do( #%1是执行bat文件时传入的第一个参数,指设备的配置文件路径del/s /q %1\%%~nv )
#因为是房子Jenkins上定时执行的,所以每次执行前删除旧脚本,以便下载最新的脚本执行echo %2
|python %1\NEW\originalinfo_execute.py #执行生成配置文件的脚本for /r %1 %%s in (originalinfo_*.txt) do(#在配置文件路径中查找配置文件svn export--force http://x.x.x.x/svn/Documents/StorageProducts/测试部/公共资源/DVR/steady_V2.0 %1\%%~ns #从svn上将脚本下载到与配置文件名称对应的文件夹中
start "s" python %1\%%~ns\case.py %%s #启动start ,执行Python
)
#######################由于在Jenkins中,start虽然启动了,
但是它相对于Jenkins是一个子线程,子线程未结束而Jenkins中的batch脚本已执行完。这样会导致start的线程自动终止。
#######################
因此,在Jenkins的batch中,增加一个死循环等待start启用的Python脚本结束ping 127 -n 3 >nul
:s
tasklist/FI "IMAGENAME EQ PYTHON.EXE" | find "python" /c >e:\temp.txt #在进程中查找python,
如果未找到,说明start结束了,则结束循环。for /f "delims=" %%i in (e:\temp.txt) do set a=%%i #
因为find的结果不能直接赋值给变量,所以先写进txt中再读出来echo %a%del e:\temp.txtping 127 -n 60 >nul #
这里写ping 主要是为了有一个等待,使得系统不会太频繁的去查询Python是否结束if %a% neq 0 goto s
注意,上述脚本是要写在bat文件里面放在Jenkins或者cmd执行的,如果要直接执行内容,则一些变量定义及语法稍稍会有点不一样。
这个想法虽然简单,但是因为之前不会batch,所以实现及调试起来还是花了一点点时间。尤其是在Jenkins中运行的时候,start的内容分分钟就结束。解决这个问题花了一些时间。希望后面能想出更好的方案~~