[20190219]xargs -P實現並行執行.txt

lfree發表於2019-02-19

[20190219]xargs -P實現並行執行.txt


--//上午做測試,連結http://blog.itpub.net/267265/viewspace-2636342/,我的執行指令碼,使用host read -p 'wait finish...'.

--//這樣很蠻煩,因為許多測試需要5分鐘完成,我必須時不時看看指令碼完成是否完成,非常繁瑣,是否可以透過shell內部的wait等後臺

--//任務完成,自動下一步操作.


--//google : xargs wait ,發現如下連結:

https://unix.stackexchange.com/questions/477971/call-a-command-wait-then-execute-another-command


--//看了許多連結感覺都不是很好,都需要寫shell指令碼.我仔細看了xargs文件,發現都忘了xargs支援-P引數可以實現並行操作.


$ time seq 10 | xargs -I{} -n1  bash -c "sleep {} "


real    0m55.040s

user    0m0.010s

sys     0m0.026s


--//這樣指令碼需要55秒完成.

$ echo {1..10} | sed -e 's/ /+/g'  | bc -l

55


$ time seq 10 | xargs -I{} -n1 -P10  bash -c "sleep {} "

real    0m10.008s

user    0m0.010s

sys     0m0.026s

--//如果並行,這樣就需要10秒完成.

--//修改指令碼如下:


$ cat cc.txt

delete from job_times;

commit ;

drop table t purge;

create table t as select rownum id from dual ;

execute sys.dbms_stats.gather_table_stats ( OwnName => user,TabName => 't',Estimate_Percent => NULL,Method_Opt => 'FOR ALL COLUMNS SIZE 1 ',Cascade => True ,No_Invalidate => false);

alter procedure do_work compile ;

alter procedure do_work1 compile ;

host sleep 3


host seq &&1 | xargs -I{} -n1 -P &&1 bash -c "sqlplus -s -l  scott/&&2 <<< \"execute do_work(&&3,'null')\" "  > /dev/null 2>&1

host sleep 1


create unique index pk_t on t(id);

alter table t modify (id  not null);

host seq &&1 | xargs -I{} -n1 -P &&1 bash -c "sqlplus -s -l  scott/&&2 <<< \"execute do_work(&&3,'notnull')\" "  > /dev/null 2>&1

host sleep 1


host seq &&1 | xargs -I{} -n1 -P &&1 bash -c "sqlplus -s -l  scott/&&2 <<< \"execute do_work1(&&3,'id=1_unique_index')\" "  > /dev/null 2>&1

host sleep 1


drop index pk_t ;

create index pk_t on t(id);

host seq &&1 | xargs -I{} -n1 -P &&1 bash -c "sqlplus -s -l  scott/&&2 <<< \"execute do_work1(&&3,'id=1_index')\" "  > /dev/null 2>&1

host sleep 1


alter table t result_cache (mode force);

host seq &&1 | xargs -I{} -n1 -P &&1 bash -c "sqlplus -s -l  scott/&&2 <<< \"execute do_work(&&3,'result_cache')\" "  > /dev/null 2>&1

host sleep 1


--//因為這樣完成在啟動新的任務,不用時不時檢視.

--//重複測試看看:

SCOTT@book> @ cc.txt 50 book 1e6

....


--//測試結果如下:

SCOTT@book> select method,count(*),round(avg(TIME_ELA),0),sum(TIME_ELA) from job_times group by method order by 3 ;

METHOD                 COUNT(*) ROUND(AVG(TIME_ELA),0) SUM(TIME_ELA)

-------------------- ---------- ---------------------- -------------

result_cache                 50                   8542        427111

id=1_unique_index            50                   9526        476293

null                         50                  10761        538056

id=1_index                   50                  29453       1472659

notnull                      50                  30639       1531925


--//10g下的測試結果:

SCOTT@test> select method,count(*),round(avg(TIME_ELA),0),sum(TIME_ELA) from job_times group by method order by 3 ;

METHOD                 COUNT(*) ROUND(AVG(TIME_ELA),0) SUM(TIME_ELA)

-------------------- ---------- ---------------------- -------------

id=1_unique_index            50                   4829        241474

notnull                      50                  33711       1685566

id=1_index                   50                  34647       1732330

null                         50                  38203       1910151


--//細節就不再說明了.


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/267265/viewspace-2636382/,如需轉載,請註明出處,否則將追究法律責任。

相關文章