V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
levenwindy
V2EX  ›  Linux

mkfifo 控制并发,如何优雅显示进度条?

  •  
  •   levenwindy · 2022-12-23 11:30:13 +08:00 · 1475 次点击
    这是一个创建于 701 天前的主题,其中的信息可能已经有所发展或是发生改变。

    代码 1 ,并发

    #!/usr/bin/env sh
    # 管道
    tmp_fifofile=/tmp/1001.fifo              
    mkfifo $tmp_fifofile
    exec 1001<> $tmp_fifofile
    rm $tmp_fifofile
    
    # 线程数
    thread=4
    for i in `seq $thread`
    do
        echo >&1001             
    done
    
    for i in {1..254}
    do
        read -u 1001
        {
    		sleep 0.5
    		echo >&1001           
        }&          #  并发执行
    done
    wait
    exec 1001>&-                # 释放文件描述符
    echo "all finish..."
    

    代码 2 进度条

    #!/usr/bin/env sh
    i=0
    b=""
    array=('-' '\\' '|' '/')
    while [ $i -le 100 ]
    do
    	let idx=i%4
    	printf "\e[34m\033[40m[%-100s]\e[32m\033[40m [%d%%] \e[30m \033[42m [%c] \e[0m\r" "$b" "$i" "${array[$idx]}"
    	b+='#'
    	sleep 0.02
    	let i++
    done
    echo ''
    

    想把两段代码结合在一起

    # 简写
    b=""
    do
        {   
    	# 想在代码 1 这,显示进度条
    	b+="#"  
    	echo "$b"
            # b 的结果 永远等于#,不能叠加
        }&
    done
    

    export b 环境变量也不行,想不到别的方法了 如果是 python ,global 声明一下就好了

    想把两段代码结合在一起,或者有没相关控制并发显示进度条的例子?

    levenwindy
        1
    levenwindy  
    OP
       2022-12-23 11:59:17 +08:00
    附:
    do
    read -u 1001
    如果将代码放在这就没问题,但是带来的问题就是,并发代码都没执行完,进度条就已经跑了
    {
    }&
    done
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2514 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 02:34 · PVG 10:34 · LAX 18:34 · JFK 21:34
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.