如何在异步多线程爬网程序中锁定回调类

本文关键字:程序 锁定 回调 异步 多线程 | 更新日期: 2023-09-27 18:35:10

我写了一个爬虫,它使用用户加载的单词列表在一个网站上执行多次搜索并解析每个结果页面。

为了实现这一点,我编写了一个 main 方法,该方法循环遍历单词列表,异步发送多个 http get 请求(使用 ThreadPool.QueueUserWorkItem)以获取当前单词的所有结果页面,直到找不到更多结果,然后继续下一个单词。

回调函数使用静态方法访问公共静态类,该方法解析返回的 html 并采取相应的行动。现在,每次访问该方法时,我都会将其锁定在类类型上:

    static class Parser
{
    public static string ResponseAsString(HttpWebResponse response)
    {
        lock (typeof(Parser))
        {
            try
            {
                Stream stream;
                if (response == null || (stream = response.GetResponseStream()) == null) return string.Empty;
                using (var sr = new StreamReader(stream))
                    return sr.ReadToEnd();
            }
            catch { return string.Empty; }
        }
    }
    public static void CallbackMethod_ParseData(string html)
    {
        lock (typeof(Parser))
        {
            //Do some work here
        }
    }
}

所以归结为我的问题:我如何更有效地锁定类并在释放锁时通知等待线程,或者我不应该使 Parser 成为静态类,而是让每个 ThreadPool 线程实例化它自己的此类实例?

非常感谢您的帮助,

-仍在学习

如何在异步多线程爬网程序中锁定回调类

锁不是必需的。 静态方法只要不共享静态数据,就是线程安全的,根据你的示例,它们不是。

看看你的代码,我认为没有任何理由拥有锁。