【发布时间】:2013-12-11 08:00:36
【问题描述】:
我正在编写一个同时运行多个请求的网络抓取程序。但是,有些请求需要连续发生,所以我的第一个想法是对需要一起发生的两个请求加锁,并在其他请求周围加锁。这种方法的问题是其他两个请求会相互锁定,但可以并行运行。
例如,我需要网站上有四个页面的数据:
- example.com/page1
- example.com/page2
- example.com/page3
- example.com/page4
当程序启动时,我启动了三个线程:一个用于 page1,一个用于 page2 和 page 3,一个用于 page4。 page3 的请求必须在 page2 的请求之后直接发生。 page1 和 page4 的请求可以同时发生。
如果我不使用锁定,可能会在请求 page2 和 page3 之间请求 page1 或 page4 并导致问题。如果我对三个线程使用相同的锁,那么对 page1 的请求可能会阻塞对 page4 的请求。
如何防止在 page2 和 page3 之间发生请求,但允许其他请求同时发生?
【问题讨论】:
-
强制性警告:如果您非常关心东西运行的顺序,那么线程可能是错误的答案。您试图名义上并行运行一些东西,然后强制它串行运行——这违背了整个目的。
-
"对 page2 的请求必须发生在对 page2 的请求之后。" - 目前这个错字(不管是什么)使这个问题很难理解。
-
@cHao,根据工作是什么,创建和启动线程可能是我们的优势,因此它们可以,例如,进行一些初始化,然后等待触发。如果为线程准备数据和创建线程并行运行,这可能会特别节省时间。
-
@cHao,我关心一些请求的顺序,而不是整个请求。
-
为什么不简单地在同一个线程上按正确的顺序执行第 2 页和第 3 页?
标签: c# multithreading locking