DataTable不适合这种线程化操作吗?
Is DataTable unsuitable for this type of threaded operation?
我有一个 header 的 CSV 文件。每行代表必须完成的涉及 HTTP 请求和处理数据的工作。
我需要使它成为多线程的,这样可以更快地工作,但我不确定 DataTable 是否适合这个。
我的流程是:
- 将 CSV 加载到 DataTable
- 一个调度函数会queue个任务,为每个任务分配一个DataTable行号(我会限制并发任务的数量)
- 每个任务将只读取分配给它们的 DataTable 行。完成工作,然后相应地更新 DataTable 行并完成。
- 在操作结束或收到取消令牌时,DataTable 将序列化回 CSV 文件。
只有 1 个任务会访问单独的行,但多个任务会同时访问分配给它们的行。
这可能会给我带来问题吗?
由于没有两个任务会访问同一个 DataTable 行,因此是否有必要在每次任务读取或写入其 DataTable 行之前锁定 DataTable?
请参阅 DataTable
class 的文档,其中指出:
Thread Safety
This type is safe for multithreaded read operations. You must synchronize any write operations.
所以更新的时候需要加锁。行读取和处理应该是安全的。
请注意,执行写入操作时读取是否安全尚不完全清楚。如果你宁愿安全也不愿后悔,你可以使用 ReaderWriterLockSlim
.
鉴于您正在限制并发任务的数量,避免大量锁争用的一个好策略可能是为每个任务提供一个(顺序的)行号分区,并让它们执行批量更新许多已处理的行。
我有一个 header 的 CSV 文件。每行代表必须完成的涉及 HTTP 请求和处理数据的工作。
我需要使它成为多线程的,这样可以更快地工作,但我不确定 DataTable 是否适合这个。
我的流程是:
- 将 CSV 加载到 DataTable
- 一个调度函数会queue个任务,为每个任务分配一个DataTable行号(我会限制并发任务的数量)
- 每个任务将只读取分配给它们的 DataTable 行。完成工作,然后相应地更新 DataTable 行并完成。
- 在操作结束或收到取消令牌时,DataTable 将序列化回 CSV 文件。
只有 1 个任务会访问单独的行,但多个任务会同时访问分配给它们的行。
这可能会给我带来问题吗?
由于没有两个任务会访问同一个 DataTable 行,因此是否有必要在每次任务读取或写入其 DataTable 行之前锁定 DataTable?
请参阅 DataTable
class 的文档,其中指出:
Thread Safety
This type is safe for multithreaded read operations. You must synchronize any write operations.
所以更新的时候需要加锁。行读取和处理应该是安全的。
请注意,执行写入操作时读取是否安全尚不完全清楚。如果你宁愿安全也不愿后悔,你可以使用 ReaderWriterLockSlim
.
鉴于您正在限制并发任务的数量,避免大量锁争用的一个好策略可能是为每个任务提供一个(顺序的)行号分区,并让它们执行批量更新许多已处理的行。