小编Big*_* AL的帖子

立即启动异步任务,稍后等待

C#程序员试图学习一些Python。我正在尝试运行CPU密集型计算,同时让IO绑定的异步方法在后台悄悄切换。在C#中,我通常会设置等待的时间,然后启动CPU密集型代码,然后等待IO任务,然后合并结果。

这是我在C#中的做法

static async Task DoStuff() {
    var ioBoundTask = DoIoBoundWorkAsync();
    int cpuBoundResult = DoCpuIntensizeCalc();
    int ioBoundResult = await ioBoundTask.ConfigureAwait(false);

    Console.WriteLine($"The result is {cpuBoundResult + ioBoundResult}");
}

static async Task<int> DoIoBoundWorkAsync() {
    Console.WriteLine("Make API call...");
    await Task.Delay(2500).ConfigureAwait(false); // non-blocking async call
    Console.WriteLine("Data back.");
    return 1;
}

static int DoCpuIntensizeCalc() {
    Console.WriteLine("Do smart calc...");
    Thread.Sleep(2000);  // blocking call. e.g. a spinning loop
    Console.WriteLine("Calc finished.");
    return 2;
}
Run Code Online (Sandbox Code Playgroud)

这是python中的等效代码

static async Task DoStuff() {
    var ioBoundTask = DoIoBoundWorkAsync();
    int cpuBoundResult = DoCpuIntensizeCalc(); …
Run Code Online (Sandbox Code Playgroud)

python async-await jupyter-notebook

6
推荐指数
1
解决办法
250
查看次数

熊猫的递归关系

我有一个DataFrame,df在pandas中有系列df.A,df.B我正在尝试创建第三个系列,df.C它依赖于A和B以及之前的结果.那是:

C[0]=A[0]

C[n]=A[n] + B[n]*C[n-1]

这样做最有效的方法是什么?理想情况下,我不必回到for循环中.


编辑

这是给定A和B的C的期望输出.现在只需要弄清楚如何...

import pandas as pd

a = [ 2, 3,-8,-2, 1]
b = [ 1, 1, 4, 2, 1]
c = [ 2, 5,12,22,23]

df = pd.DataFrame({'A': a, 'B': b, 'C': c})
df
Run Code Online (Sandbox Code Playgroud)

python numpy pandas

5
推荐指数
1
解决办法
231
查看次数

IO绑定异步工作所需的线程数

TL; DR: 是否可以仅使用一个线程启动一系列IO绑定任务async await

简而言之: 努力学习async await.在本视频("C#和Visual Basic的异步最佳实践")中,演讲者举例说明了async await如何启动一些IO绑定工作.他明确地说(在21分40秒)同时解释了为什么并行for循环不是最佳的,因为它们耗尽了线程的负载:

我们不需要更多线程.我们不需要两个线程......

我们真的可以在不使用多个线程的情况下异步启动多个请求吗?怎么样?不幸的是,发言人没有提供所有的代码,所以这是我的努力:

// Pretty much exactly the same as video
private async Task<List<string>> LoadHousesAsync()
{
    // Running on the UI thread
    Debug.Print("Thread: " + Thread.CurrentThread.ManagedThreadId);
    var tasks = new List<Task<string>>();

    for (int i = 0; i < 5; i++)
    {
        Task<string> t = LoadHouseAsync(i);
        tasks.Add(t);
    }

    string[] loadedHouses = await Task.WhenAll(tasks);
    return loadedHouses.ToList();
}

// My guess of the LoadHouseAsync method
private Task<string> …
Run Code Online (Sandbox Code Playgroud)

c# asynchronous async-await

0
推荐指数
1
解决办法
476
查看次数