注册
登录
论坛
搜索
帮助
导航
设置
VIP
私人消息 (0)
公共消息 (0)
论坛任务 (0)
系统消息 (0)
好友消息 (0)
帖子消息 (0)
批处理之家
»
PowerShell求助&讨论
» 如何写多线程?
[新手上路]
批处理新手入门导读
[视频教程]
批处理基础视频教程
[视频教程]
VBS基础视频教程
[批处理精品]
批处理版照片整理器
[批处理精品]
纯批处理备份&还原驱动
[批处理精品]
CMD命令50条不能说的秘密
[在线下载]
第三方命令行工具
[在线帮助]
VBScript / JScript 在线参考
返回列表
发帖
xczxczxcz
发短消息
加为好友
xczxczxcz
(Tα酱油路过)
当前离线
UID
52077
帖子
715
精华
0
积分
970
PB
715
技术
85
捐助
0
阅读权限
40
在线时间
142 小时
注册时间
2012-9-14
最后登录
2025-3-8
中尉
帖子
715
积分
970
技术
85
捐助
0
注册时间
2012-9-14
1
楼
跳转到
»
倒序看帖
打印
字体大小:
t
T
发表于 2021-4-26 14:26
|
显示全部帖子
[原创教程]
如何写多线程?
偶看了许多坛内坛外的高手的多线程代码,PY POWERSHELL C# C++的。 发现很多都有一个共同爱好,动不动就索数据。 lock(CustomDatas){};
偶想说的是:这他妈的哪是多线程。是打着多线程的名义做的却是同步命令。占着茅坑不拉屎纯耗资源。关键很多名教程书籍也动不动就锁资源,误人子弟
。
偶的做法:一定要先建立一个
自定义数据
是类型不是集合,用来存储多线程下载内容。并且做每个数据独立,让它在存储在堆内存上(不要做死存在栈上),比如1万条数据,那么在堆内存中就有1万个坑,然后(异步)建立线程池。IO线程。让指定的线程数不停地去处理这一万个坑。【比如10个线程,首先处理前10个坑,若其中一个线程先处理完了,它立即去处理第11个坑,已处理完的数据就留在坑里,这样直到所有的坑处理完为止】。最后 Dispose() 数据类型。
测试 下载 网页小说,4~5千章内容,也就眨几下眼完成了。CPU使用率相当低。20个线程内存点用几十兆。机械硬盘读写数据时尽量不要多线程(偶测试2条线程内有点优势,40条到80时硬盘停转假死,磁头不知道该读哪个区),
如果觉得偶的做法不好或说有不清,可以喷轻点。
1
评分人数
523066680:
感谢分享
技术 + 1
收藏
分享
QQ: 458609586
脚本优先 [
PowerShell win10
]
xczxczxcz
发短消息
加为好友
xczxczxcz
(Tα酱油路过)
当前离线
UID
52077
帖子
715
精华
0
积分
970
PB
715
技术
85
捐助
0
阅读权限
40
在线时间
142 小时
注册时间
2012-9-14
最后登录
2025-3-8
中尉
帖子
715
积分
970
技术
85
捐助
0
注册时间
2012-9-14
2
楼
发表于 2021-4-27 13:04
|
显示全部帖子
首先 感谢 大家的回复。
一、带锁的危险性
在异步多线程时,线程量很大时,线程请求频繁时,锁会让你的异步多线程崩溃。几年前一直在测试这个问题,偶看过的大多数线程教程都有问题。只是他们的例子太简单,反映不出问题。理论和实际是有区别的。
二、真正的多线程是就应该不带锁的
多线程就应该自由不受线程约束。 如10个和尚挑水把水缸装满。一次只一个人倒水,哪怕挑得再快,也和同步没多大区别。若把水缸换成10个水水缸,每个各尚负责一个缸,那立马搞定。
带了锁的还是划分到队列或者链表等合理些。
三、偶这几年自行摸索的方法
经过长时间测试,本地也好网络也好,发现运行良好,非常稳定,也许在其他教程上有,只是偶看得太少。
方法:
自定义类型封装:占21个字节
1;所封装的数据在整个数据中的位置, 点4个字节;
2;所封装的数据在内存所有坑中的索引或内存地址(C++)。 占4个字节;
3;封装的数据线程完成状态,字符串型 占4个字节;线程执行完,说一声我做完了,
4;封装的数据执行结果, bool 占1个字节,线程执行完把结果成功与否丟下就走了,
5;封装数据的统一取消指令, 事件通知, 占4个字节 (类似于群主发一条信息,所有的群成员都马上知悉,并处理这一指令)
6;封装数据接收结果的内存地址, 占4个字节,线程把处理完的数据的快递地址留下就不管了。
经过这样处理包装每一个数据后,通过线程池进入异步下载,然后就不用管他了,只接收它的信号通知就可以了, 如果是客户端就信号显示在表格中。
如果想取消下载,只要发个通知,所有线程马上停止(这个偶弄了好久,开始总是不能随意控制,技术太差,现在好多了,后台的异步也要让它停下来,线程池中也要让它停下来。)
QQ: 458609586
脚本优先 [
PowerShell win10
]
TOP
xczxczxcz
发短消息
加为好友
xczxczxcz
(Tα酱油路过)
当前离线
UID
52077
帖子
715
精华
0
积分
970
PB
715
技术
85
捐助
0
阅读权限
40
在线时间
142 小时
注册时间
2012-9-14
最后登录
2025-3-8
中尉
帖子
715
积分
970
技术
85
捐助
0
注册时间
2012-9-14
3
楼
发表于 2021-4-28 11:33
|
显示全部帖子
回复
7#
老刘1号
打开看了下,哈不错,说实话,和我上面的方法很类似。纯异步无任何阻塞。用事件消息通知。根据我的经验,对于WEB:线程数最好大于I/O数,考虑服务器承压。对于本地,I/O要大于线程数,并发能力更大。大多书和微软文档都没看到有I/O的详细设置,纯靠摸索。累。
QQ: 458609586
脚本优先 [
PowerShell win10
]
TOP
xczxczxcz
发短消息
加为好友
xczxczxcz
(Tα酱油路过)
当前离线
UID
52077
帖子
715
精华
0
积分
970
PB
715
技术
85
捐助
0
阅读权限
40
在线时间
142 小时
注册时间
2012-9-14
最后登录
2025-3-8
中尉
帖子
715
积分
970
技术
85
捐助
0
注册时间
2012-9-14
4
楼
发表于 2021-4-28 11:37
|
显示全部帖子
回复
8#
Gin_Q
五一到了,大家开车在高速上奔跑,结果被收费站来个排队交钱。又是几条车龙?
QQ: 458609586
脚本优先 [
PowerShell win10
]
TOP
xczxczxcz
发短消息
加为好友
xczxczxcz
(Tα酱油路过)
当前离线
UID
52077
帖子
715
精华
0
积分
970
PB
715
技术
85
捐助
0
阅读权限
40
在线时间
142 小时
注册时间
2012-9-14
最后登录
2025-3-8
中尉
帖子
715
积分
970
技术
85
捐助
0
注册时间
2012-9-14
5
楼
发表于 2021-4-28 11:51
|
显示全部帖子
new Thread 这几乎被微软抛弃了, 过时,占资源, POWERSHELL 用这种方式开个20条线程,其它的事都不用做了,异步开个20条线程,CPU还在那睡觉。
QQ: 458609586
脚本优先 [
PowerShell win10
]
TOP
xczxczxcz
发短消息
加为好友
xczxczxcz
(Tα酱油路过)
当前离线
UID
52077
帖子
715
精华
0
积分
970
PB
715
技术
85
捐助
0
阅读权限
40
在线时间
142 小时
注册时间
2012-9-14
最后登录
2025-3-8
中尉
帖子
715
积分
970
技术
85
捐助
0
注册时间
2012-9-14
6
楼
发表于 2021-5-8 17:30
|
显示全部帖子
回复
14#
Gin_Q
测试外链
https://v.youku.com/v_show/id_XNTE0OTg3OTExMg==.html
没在这用过外链,看行不行。
QQ: 458609586
脚本优先 [
PowerShell win10
]
TOP
xczxczxcz
发短消息
加为好友
xczxczxcz
(Tα酱油路过)
当前离线
UID
52077
帖子
715
精华
0
积分
970
PB
715
技术
85
捐助
0
阅读权限
40
在线时间
142 小时
注册时间
2012-9-14
最后登录
2025-3-8
中尉
帖子
715
积分
970
技术
85
捐助
0
注册时间
2012-9-14
7
楼
发表于 2021-5-8 18:49
|
显示全部帖子
回复
16#
Gin_Q
偶这是完全按照 网站的请求方式 获取,所有的网页读取 gzip 数据流。回来再解码并判断编码,测试过80个线程,网站也不封,可能是因为异步的。
你上次那个 biqugeso.com 这个垃圾网,按常规下载,每个线程要间隔0.5秒左右,否则后面的线程很容易被拒绝请求,按新方法20个线程可迅速下载。
偶不爬小说,纯是为了测试线程的封闭方法哪种更好些。
QQ: 458609586
脚本优先 [
PowerShell win10
]
TOP
返回列表
VBS原创&转载
BAT求助&讨论
新手练功
BAT教程&资料
Python
BAT原创&转载
批处理专区: BAT CMD DOS
BAT求助&讨论
BAT教程&资料
BAT原创&转载
BAT新大陆
BAT转载代码
新手练功
出题挑战
有偿求助
第三方命令行
开源原创工具
iBAT
Take Command
其他脚本区
PowerShell求助&讨论
PowerShell教程&资料
PowerShell原创&转载
VBS求助&讨论
JS / JScript / JavaScript
VBS教程&资料
VBS原创&转载
UNIX/Linux Shell
Python
Perl
网络资源区
电脑技术研讨
精品软件交流
论坛事务区
站务交流
意见反馈
论坛公告
版主申请
交换链接
建站杂谈
活动专区
论坛总版规
[收藏此主题]
[关注此主题的新回复]
[通过 QQ、MSN 分享给朋友]
设置
关闭
开启 【页面动态效果 + 卡片式布局】
关闭 【页面动态效果 + 卡片式布局】