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) 我有一个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) 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)