免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1130 | 回复: 3

[学习共享] 分享powershell脚本:同一个txt文件,300个并发写入 [复制链接]

论坛徽章:
0
发表于 2019-09-19 15:30 |显示全部楼层
本帖最后由 本友会机友会摄友会 于 2019-09-19 15:43 编辑

分享powershell脚本:同一个txt文件,300个并发写入

-------1【前言】---------
斗:古诗有云:八百标兵奔北坡,三百i/o并发写入同一个txt。
捧:你这哪门子古诗啊?
斗:我就这么一说。


-------2【简介,用法】---------
这是我编写,给大家奉献的并发输出脚本,
脚本名:【bf并发写入txt_v1.1.ps1】

脚本作用:
用于并发任务的输出,比如ping的输出,这无需多说。
会向已有txt,插入一行,并插入回车。并把输出写上bom头,utf16le格式。


linux用法:
bf并发写入txt_v1.1.ps1 -输出文件 "/tmp/已有的输出文件.txt" -输出值 "xxx"

win用法:
bf并发写入txt_v1.1.ps1 -输出文件 "d:\xxx\已有的输出文件.txt" -输出值 "xxx"

在bash中调用:
pwsh -f /tmp/bf并发写入txt_v1.1.ps1 -输出文件 "/tmp/已有的输出文件.txt" -输出值 "xxx"

注意:
【数组|ForEach-Object  -ThrottleLimit 300 -Parallel】是powershell v7 的新功能。
在pwershell v7没成为正式版时,需要这么调用:
pwsh-preview -f /tmp/bf并发写入txt_v1.1.ps1 -输出文件 "/tmp/已有的输出文件.txt" -输出值 "xxx"


下载地址:
https://pan.baidu.com/s/16deKKe3ZnCg809lffiVZWg


-------3【原理】---------
txt是不能同时写入的,会丢数据。我的脚本解决了这个问题。
原理是【锁住文件】!!!,加随机延时写入。

-------4【使用场景】---------


这里有几个细节:
1 适合在win,linux下,powershell多线程任务,如*-job。
2 适合在win,linux下,powershell7多线程任务,数组 | foreach-object -parallel
3 适合在win下,powershell的workflow多进程任务。
4 同时适合在win,linux下,bat,bash脚本,不过要通过在bash脚本内调用powershell.exe(或pwsh)来输出。

假设我们有300个并发io,我们可以看出,
场景1,2是最适合的。速度飞快。
场景3,4需要运行300个pwsh进程,有点不值当。
但是捏,假如服务器内存宽松,这也不失为一个【简单解决并发写入txt】的办法。




-------5【详细用法】---------

1 安装powershell:
这里以centos7为例,这里安装的是powershell v7 preview版

curl -o /etc/yum.repos.d/microsoft.repo  https://packages.microsoft.com/config/rhel/7/prod.repo
sudo yum remove -y powershell-preview #删除旧版
sudo yum install -y powershell-preview
pwsh -c 'mkdir -p "$env:HOME/.config/powershell" '
pwsh -c 'Add-Content  -Value "Set-PSReadlineOption -EditMode Windows" -LiteralPath $profile '
pwsh -c 'Add-Content  -Value "`nSubsystem powershell /usr/bin/pwsh -sshs -NoLogo -NoProfile" -LiteralPath /etc/ssh/sshd_config '


2 测试一下,是否支持:
2.1 建立文件/tmp/a.ps1,内容为【exit 123】。
2.2 pwsh-preview
2.3 测试 1..2 |ForEach-Object -Parallel { /tmp/a.ps1 ;if ($LASTEXITCODE -eq 123) {Write-Error 'dang'}   }
结论:
ForEach-Object -Parallel,可以输出报错信息'dang'



3 测试并发写入。
注意:
这是powershell多线程并发写入!!!powershell多线程可以用cpu多核,
若你这是虚拟机,应该给虚拟机添加多核cpu。至少2核心,4核心更好。

pwsh-preview
touch /tmp/out.txt
1..10000 |ForEach-Object  -ThrottleLimit 300 -Parallel { /tmp/bf并发写入txt_v1.1.ps1 -输出值 'xxx' -输出文件 /tmp/out.txt  ; if ($LASTEXITCODE -eq 4) { Write-Error '错了'}  }


4 在打开一个终端窗口,并运行pwsh-preview。
频繁输入:
(get-content /tmp/out.txt).length
输出的是这个文件的行数。
根据观察,根据你的cpu核心数的不同,每秒钟能写100------200行。


-------6【后记】---------

古诗有云:
八百标兵奔北坡,三百i/o并发写入同一个txt。
如果是ssd硬盘,800个i/o奔同一个txt也行。
若不是,并发太多没用,徒耗cpu。

谢谢观赏。


论坛徽章:
0
发表于 2019-09-27 19:13 |显示全部楼层
这个不错哦。。。。

论坛徽章:
0
发表于 2019-09-28 09:08 |显示全部楼层
本帖最后由 yexingqi 于 2019-09-28 09:09 编辑

请教一下,我直接用flock跟用这个ps脚本的差异在哪里呢? 以下的方法是否有缺陷呢? 我有一个NFS共享的文件要被多台机器写入信息,正在想用什么方式防止同时写入。 感谢!
flock -e /tmp/aaa -c "sleep 10;echo 111111 | cat >> /tmp/aaa"
flock -e -w 5 /tmp/aaa -c "sleep 1;echo `date` | cat >> /tmp/aaa"

论坛徽章:
0
发表于 2019-09-28 12:40 |显示全部楼层
1 我这个我用5万总文件写入,300并发测试过,没问题。没出现报错。

2 flock没用过。我赶脚我这个应该比flock快不少,我这个是线程级别的锁。

3 我这个对nfs文件,灵不灵,还得测试。
我记得nfs有个参数,关闭独占文件,可以使文件写入快。如果设定上,这类工具都不灵了。
总之看nfs手册,并设定参数,并测试。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

PostgreSQL中国大会,早鸟票抢购!

PostgreSQL中国大会,早鸟票抢购!
2019年11月29~11月30日,由 PostgreSQL中文社区与ITPUB联合主办的第九届《PostgreSQL 中国技术大会》将在北京隆重召开。PostgreSQL 作为功能最强的的开源关系型数据库之一,得到了越来越多企业的推广和运用,也越来越受到广大技术爱好者的欢迎和重视。这将是 PostgreSQL 的又一次交流盛会。




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

点击报名>>
  

北京盛拓优讯信息技术有限公司. 版权所有 16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122
中国互联网协会会员  联系我们:huangweiwei@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP