2012-07-31 41 views
0

每次上傳後我們都必須緩存一個相當大的數據庫,所以我們創建了一個bash腳本來處理它。腳本應該啓動4個併發捲髮到站點,一旦完成,從我們存儲在文件中的URL列表中開始下一個腳本。bash:並行運行cURL比一個接一個慢

理論上一切正常,如果我們運行從本地機器到目標站點的運行4進程,這個概念就可以工作。

如果我設置MAX_NPROC = 1捲曲只要將瀏覽器是否擊中URL 即20多歲的 如果我設置的要求採取了MAX_NPROC = 2的時候,三倍需要。

我錯過了什麼嗎?這是一個讓我們放慢速度的apache設置嗎?或者這是我錯過的一個祕密cURL設置?

任何幫助將不勝感激。請在下面找到bash腳本

#!/bin/bash 

if [[ -z $2 ]]; then 
    MAX_NPROC=4 # default 
else 
    MAX_NPROC=$2 
fi 

if [[ -z $1 ]]; then 
    echo "File with URLs is missing" 
    exit 
fi; 

NUM=0 
QUEUE="" 

DATA="" 
URL="" 

declare -a URL_ARRAY 
declare -a TIME_ARRAY 
ERROR_LOG="" 

function queue { 
    QUEUE="$QUEUE $1" 
    NUM=$(($NUM+1)) 
} 

function regeneratequeue { 
    OLDREQUEUE=$QUEUE 

    echo "OLDREQUEUE:$OLDREQUEUE" 


    QUEUE="" 
    NUM=0 
    for PID in $OLDREQUEUE 
    do 
     process_count=`ps ax | awk '{print $1 }' | grep -c "^${PID}$"` 

     if [ $process_count -eq 1 ] ; then 
      QUEUE="$QUEUE $PID" 
      NUM=$(($NUM+1)) 
     fi 
    done 

} 

function checkqueue { 
    OLDCHQUEUE=$QUEUE 
    for PID in $OLDCHQUEUE 
    do 

     process_count=`ps ax | awk '{print $1 }' | grep -c "^${PID}$"` 

     if [ $process_count -eq 0 ] ; then 
      wait $PID 
      my_status=$? 
      if [[ $my_status -ne 0 ]] 
      then 
       echo "`date` $my_status ${URL_ARRAY[$PID]}" >> $ERROR_LOG 
      fi 

      current_time=`date +%s` 
      old_time=${TIME_ARRAY[$PID]} 
      time_difference=$(expr $current_time - $old_time) 

      echo "`date` ${URL_ARRAY[$PID]} END ($time_difference seconds)" >> $REVERSE_LOG 

      #unset TIME_ARRAY[$PID] 
      #unset URL_ARRAY[$PID] 

      regeneratequeue # at least one PID has finished 
      break 
     fi 
    done 
} 

REVERSE_LOG="$1.rvrs" 
ERROR_LOG="$1.error" 

echo "Cache STARTED at `date`" > $REVERSE_LOG 
echo "" > ERROR_LOG 

while read line; do 

    # create the command to be run 
    DATA="[email protected]&password=password" 
    URL=$line 
    CMD=$(curl --data "${DATA}" -s -o /dev/null --url "${URL}") 

    echo "Command: ${CMD}"  
    # Run the command 
    $CMD & 
    # Get PID for process 
    PID=$! 
    queue $PID; 
    URL_ARRAY[$PID]=$URL; 
    TIME_ARRAY[$PID]=`date +%s` 
    while [ $NUM -ge $MAX_NPROC ]; do 
     checkqueue 
     sleep 0.4 
    done 
done < $1 
echo "Cache FINISHED at `date`" >> $REVERSE_LOG 
exit 

回答

1

網絡幾乎總是瓶頸。產生更多的連接通常會使其變慢。

你可以試試,看看parallel'izing它將給你帶來任何好通過產生幾個

時間嫋嫋...... &

相關問題