python并发运行

我们知道,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.txt ping 127 -n 60 >nul #这里写ping 主要是为了有一个等待,使得系统不会太频繁的去查询Python是否结束 if %a% neq 0 goto s

 注意,上述脚本是要写在bat文件里面放在Jenkins或者cmd执行的,如果要直接执行内容,则一些变量定义及语法稍稍会有点不一样。

 

这个想法虽然简单,但是因为之前不会batch,所以实现及调试起来还是花了一点点时间。尤其是在Jenkins中运行的时候,start的内容分分钟就结束。解决这个问题花了一些时间。希望后面能想出更好的方案~~

 

posted @ 2018-05-19 18:45  小鱼biubiu  阅读(272)  评论(0编辑  收藏  举报