【问题标题】:Parallel For Each with a Thread.Sleep每个线程并行。睡眠
【发布时间】:2023-03-03 11:33:01
【问题描述】:

基本上,我想从同一个 URL 访问很多页面,但我不想在同一秒发送垃圾邮件。而且我不想在 30 分钟内结束。 并行内的 Thread.Sleep() 工作正常吗? 因为大约 90 分钟后我才完成。

        var pages = new List<string>( urls );
        var sources = new BlockingCollection<string>();

        string htmlCode = "";

        Random randomN = new Random();

        Parallel.ForEach(pages, x =>
        {
            x = x.Replace("//", "http://");
            int sleep = randomN.Next(0, 1800000);
            Thread.Sleep(sleep);

            HttpWebResponse response = null;
            CookieContainer cookie = new CookieContainer();

            HttpWebRequest newRequest = (HttpWebRequest)WebRequest.Create(x);
            newRequest.Timeout = 15000;
            newRequest.Proxy = null;
            newRequest.CookieContainer = cookie;
            newRequest.UserAgent = "Mozilla / 5.0(Windows NT 5.1) AppleWebKit / 537.11(KHTML, like Gecko) Chrome / 23.0.1300.0 Iron / 23.0.1300.0 Safari / 537.11";
            newRequest.ContentLength = 0;
            response = (HttpWebResponse)newRequest.GetResponse();
            htmlCode = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding(1252)).ReadToEnd();
            sources.Add(htmlCode);

        });

        return sources;

【问题讨论】:

    标签: multithreading


    【解决方案1】:

    但是,对于您要达到的目标,要求并不是很明确。但是 parallel.foreach 中的 Thread.Sleep 可能不是正确的选择。尝试通过以下线程,它们可能会有所帮助并解决您的问题。

    [1]。 Parallel.ForEach using Thread.Sleep equivalent

    [2]。 Thread.Sleep blocking parallel execution of tasks

    [3]。 Parallel ForEach wait 500 ms before spawning

    【讨论】:

      【解决方案2】:

      你不想在你的 Parallel.ForEach 体内睡觉——那只会占用 .NET 线程池中的工作线程。

      这就是Task.Delay 的用途。只需创建一堆延迟任务,然后对它们执行WaitAll

      【讨论】:

      • 哦,还有一个不相关的提示:永远不要在 Parallel.ForEach 主体中使用单个 System.Random 实例...它不是线程安全的,并且会严重中断(开始返回零) .请参阅此blog entry 了解解决方法。
      • Parallel.ForEach 也会阻塞线程,因此它仅适用于前端应用程序或测试,不适用于需要并行运行大量 Parallel.ForEach 流的后端服务器。
      猜你喜欢
      • 1970-01-01
      • 2018-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-08
      • 1970-01-01
      相关资源
      最近更新 更多