簡體   English   中英

並發處理項目並順序寫入結果?

[英]Process items concurrently and write the results sequentially?

以下 Python 代碼(從並行讀取和順序寫入? )處理(讀取)ID 0 到 N 的數據。讀取器並行運行,並按 ID 的順序寫入結果。 如何在C#中有效地實現它?

async def reader(q, id_to_data, data_ready):  # Multiple readers are run in parallel
    while True:
        id = await q.get()
        data = await read_async(id) 
        id_to_data[id] = data
        data_ready.set()

async def main():
    q = asyncio.Queue()
    for id in range(1000):
        await q.put(id)

    id_to_data = {}
    data_ready = asyncio.Event()
    readers = [asyncio.create_task(reader(q, id_to_data, data_ready))
               for _ in range(3)]

    for id in range(1000):
       while True:
           # wait for the current ID to appear before writing
           if id in id_to_data:
               data = id_to_data.pop(id)
               await data.write_async(f'{id}.csv')
               break
               # move on to the next ID
           else:
               # wait for new data and try again
               await data_ready.wait()
               data_ready.clear()

    for r in readers:
        r.cancel()

C#:

void main() {
    List<int> ids = get_IDs();
    ProcessAllIDs(ids);
}

async Task ProcessAllIDs(List<int> ids) {
    // A low efficient implementation
    for (var id in ids) {
        var result = await Process1(id); // Can be run concurrently
        await Process2(result); // Need to be run sequentially 
    }
}

一種簡單的方法是創建一個任務列表,然后按順序等待它們:

var list = new List<Task<int>> { Calculate(2), Calculate(7), Calculate(19) };

foreach(var task in list)
{
  Console.WriteLine(await task);
}

static async Task<int> Calculate(int x)
{
  await Task.Delay(200);
  return x*x;
}

這將啟動 3 個同時計算內容的任務,然后按順序打印結果。

因此,對於您的示例,它看起來像這樣:

async Task main() {
    List<int> ids = get_IDs();
    await ProcessAllIDs(ids);
}

async Task ProcessAllIDs(List<int> ids) {
    var tasks = ids.Select(id => Process1(id)).ToList();
    for (var t in tasks) {
        await Process2(await t); // Need to be run sequentially 
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM