簡體   English   中英

Bash並發作業陷入困境

[英]Bash concurrent jobs gets stuck

我已經實現了一個辦法讓bash兼職,因為看到這里

我正在遍歷大約13000行的文件。 我只是測試並打印每一行,如下所示:

#!/bin/bash
max_bg_procs(){
    if [[ $# -eq 0 ]] ; then
        echo "Usage: max_bg_procs NUM_PROCS.  Will wait until the number of background (&)"
        echo "           bash processes (as determined by 'jobs -pr') falls below NUM_PROCS"
        return
    fi
    local max_number=$((0 + ${1:-0}))
    while true; do
        local current_number=$(jobs -pr | wc -l)
        if [[ $current_number -lt $max_number ]]; then
                echo "success in if"
                break
        fi
        echo "has to wait"
        sleep 4
    done
}

download_data(){
    echo "link #" $2 "["$1"]"
}

mapfile -t myArray < $1

i=1
for url in "${myArray[@]}"
do
    max_bg_procs 6
    download_data $url $i &
    ((i++))
done
echo "finito!"

我也嘗試過其他解決方案,例如thisthis ,但是我的問題仍然存在:

在給定的“隨機”步驟(通常在第2000次與第5000次迭代之間),它只會卡住。 我已將各種echo放在代碼的中間,以查看將在何處卡住,但它最后打印出的是$url $i

我已經完成了簡單的測試,刪除了任何並行性,只循環了文件內容:一切正常,並且循環到最后。

因此,這讓我覺得我在並行性方面缺少一些限制,而且我想知道是否有人可以幫助我解決並行性問題。

非常感謝!

在這里,我們最多有6個並行的bash進程調用download_data ,每個調用每次傳遞最多16個URL。 根據您自己的調整進行調整。

請注意,這同時需要bash(用於導出功能支持)和GNU xargs。

#!/usr/bin/env bash
#              ^^^^- not /bin/sh

download_data() {
  echo "link #$2 [$1]" # TODO: replace this with a job that actually takes some time
}
export -f download_data
<input.txt xargs -d $'\n' -P 6 -n 16 -- bash -c 'for arg; do download_data "$arg"; done' _

使用GNU Parallel看起來像這樣

cat input.txt | parallel echo link '\#{#} [{}]' 

{#} =工作編號
{} =參數

每個CPU將產生一個進程。 如果您想並行使用6 -j:

cat input.txt | parallel -j6 echo link '\#{#} [{}]' 

如果您喜歡運行函數:

download_data(){
    echo "link #" $2 "["$1"]"
}
export -f download_data
cat input.txt | parallel -j6 download_data {} {#} 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM