[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[原创教程] 如何写多线程?

偶看了许多坛内坛外的高手的多线程代码,PY POWERSHELL C# C++的。 发现很多都有一个共同爱好,动不动就索数据。 lock(CustomDatas){};
偶想说的是:这他妈的哪是多线程。是打着多线程的名义做的却是同步命令。占着茅坑不拉屎纯耗资源。关键很多名教程书籍也动不动就锁资源,误人子弟

偶的做法:一定要先建立一个 自定义数据是类型不是集合,用来存储多线程下载内容。并且做每个数据独立,让它在存储在堆内存上(不要做死存在栈上),比如1万条数据,那么在堆内存中就有1万个坑,然后(异步)建立线程池。IO线程。让指定的线程数不停地去处理这一万个坑。【比如10个线程,首先处理前10个坑,若其中一个线程先处理完了,它立即去处理第11个坑,已处理完的数据就留在坑里,这样直到所有的坑处理完为止】。最后 Dispose() 数据类型。
测试 下载 网页小说,4~5千章内容,也就眨几下眼完成了。CPU使用率相当低。20个线程内存点用几十兆。机械硬盘读写数据时尽量不要多线程(偶测试2条线程内有点优势,40条到80时硬盘停转假死,磁头不知道该读哪个区),

如果觉得偶的做法不好或说有不清,可以喷轻点。
1

评分人数

QQ: 己阵亡
脚本优先 [PowerShell win10]

回复 19# 523066680


    见笑了哈。。
QQ:1972544783

TOP

回复 18# Gin_Q


    平时习惯了看头像不看名字,结果这楼看下来都是二维码……

TOP

回复 17# xczxczxcz


    很厉害。网络交互我不懂!
QQ:1972544783

TOP

回复 16# Gin_Q

偶这是完全按照 网站的请求方式 获取,所有的网页读取 gzip 数据流。回来再解码并判断编码,测试过80个线程,网站也不封,可能是因为异步的。
你上次那个 biqugeso.com 这个垃圾网,按常规下载,每个线程要间隔0.5秒左右,否则后面的线程很容易被拒绝请求,按新方法20个线程可迅速下载。

偶不爬小说,纯是为了测试线程的封闭方法哪种更好些。
QQ: 己阵亡
脚本优先 [PowerShell win10]

TOP

回复 15# xczxczxcz


    速度很快,爬这么快不怕封ip吗?
QQ:1972544783

TOP

回复 14# Gin_Q


    测试外链 https://v.youku.com/v_show/id_XNTE0OTg3OTExMg==.html
没在这用过外链,看行不行。
QQ: 己阵亡
脚本优先 [PowerShell win10]

TOP

回复 13# xczxczxcz


    线程本身是并行的,会占用cpu资源,当线程被锁住时,cpu资源将被释放。
C# 示例
  1. using System;
  2. using System.Threading;
  3. class Test
  4. {
  5.     static void Main()
  6.     {
  7.         int PoolSize = Environment.ProcessorCount; // 获取当前计算机上的处理器数。
  8.          
  9.         EventWaitHandle ewh = new EventWaitHandle(false, EventResetMode.ManualReset); // 事件锁
  10.         
  11.         Thread[] ThreadPool = new Thread[PoolSize];
  12.          
  13.         for (sbyte i=0; i<PoolSize; i++)
  14.         {
  15.             ThreadPool[i] = new Thread(Occupy);
  16.             ThreadPool[i].IsBackground = true;
  17.         }
  18.         for (sbyte i=0; i<PoolSize; i++)
  19.             ThreadPool[i].Start(ewh);
  20.          
  21.         while (true)
  22.         {
  23.             Console.Write("1 占用cpu资源\n2 释放cpu资源\n");
  24.             string input = Console.ReadLine();
  25.             if (input == "1")
  26.             {
  27.                 ewh.Set();
  28.             }
  29.             else if (input == "2")
  30.             {
  31.                 ewh.Reset();
  32.             }
  33.         }
  34.     }
  35.      
  36.     static void Occupy(object EventLock)
  37.     {
  38.         EventWaitHandle el = EventLock as EventWaitHandle;
  39.         while (true)
  40.         {
  41.             el.WaitOne();
  42.         }
  43.     }
  44. }
复制代码
QQ:1972544783

TOP

new Thread 这几乎被微软抛弃了, 过时,占资源, POWERSHELL 用这种方式开个20条线程,其它的事都不用做了,异步开个20条线程,CPU还在那睡觉。
QQ: 己阵亡
脚本优先 [PowerShell win10]

TOP

回复 11# xczxczxcz


   不下高速公路就可以啦!你要访问大家共同访问的资源(收费站),这个就需要锁!
QQ:1972544783

TOP

回复 8# Gin_Q


    五一到了,大家开车在高速上奔跑,结果被收费站来个排队交钱。又是几条车龙?
QQ: 己阵亡
脚本优先 [PowerShell win10]

TOP

回复 7# 老刘1号


    太硬核了!
QQ:1972544783

TOP

回复 7# 老刘1号

打开看了下,哈不错,说实话,和我上面的方法很类似。纯异步无任何阻塞。用事件消息通知。根据我的经验,对于WEB:线程数最好大于I/O数,考虑服务器承压。对于本地,I/O要大于线程数,并发能力更大。大多书和微软文档都没看到有I/O的详细设置,纯靠摸索。累。
QQ: 己阵亡
脚本优先 [PowerShell win10]

TOP

怎么说是队列呢? 他们是并行的!
QQ:1972544783

TOP

1

评分人数

TOP

返回列表