C ++ ppl库中新创建的任务是自动执行还是需要任何机制才能启动上述任务的执行?
答案 0 :(得分:1)
该任务立即预定。
from rpy2.robjects import pandas2ri
from rpy2.robjects.packages import importr
base = importr('base')
pandas2ri.activate()
...
# CONVERT PANDAS DF TO R DF
rdf = pandas2ri.py2ri(pydf)
# FIND COLUMN INDEX OF EACH FACTOR IN DF
factors = [i for i,col in enumerate(rdf) if col.rclass[0] == 'factor']
# CONVERT COLS ITERATIVELY
for f in factors:
rdf[f] = base.as_character(rdf[f])
构造函数调用
concurrency::task
,其中称为
_TaskInitMaybeFunctor
,其中称为
_TaskInitWithFunctor<_ReturnType, _Function>
,其中称为
_ScheduleTask
调用(除非你证明了自己的schedueler)
_M_TaskCollection._ScheduleTask
,其中称为
_DefaultPPLTaskScheduler().schedule;
,其中称为
(new _PPLTaskChore{ _Proc, _Param })->_Schedule;
来电
_Schedule_chore
+ __crtCreateThreadpoolWork
,其中称为
_Reschedule_chore
,其中称为
SubmitThreadpoolWork
将任务提交到win32线程池中。 所以,是的,任务IS 计划立即。
答案 1 :(得分:0)
您无需执行任何操作即可开始执行任务。
尝试这样的代码:
#include "stdafx.h" // Windows.h for Sleep
#include <ppltasks.h>
#include <iostream>
using namespace concurrency;
using namespace std;
int main()
{
// Create a task.
task<int> t([]()
{
cout << "Task Running\n";
return 42;
});
cout << "Task created\n";
Sleep(5000L);
}
您将在控制台输出中看到此内容,程序退出前:
Task Created
Task Running
没有Sleep()程序会立即退出并破坏任务。 您可以放置一些CPU密集型操作,而不是Sleep(),例如循环中的循环可以防止程序立即退出。或者只需添加:
std::cin.get();
结果会是一样的。 您不需要调用get()或wait(),但是,如果要捕获异常或处理取消,则需要添加continuation。 在调试时,您可以启动Parallel Stacks窗口,除了主线程之外,您将看到Task Scheduler已经创建了TPP工作线程。
答案 2 :(得分:-1)
不,它不会自动启动:
#include <ppltasks.h>
#include <iostream>
using namespace concurrency;
using namespace std;
int wmain()
{
// Create a task.
task<int> t([]()
{
cout << "Task Running" << endl;
return 42;
});
cout << "Task created " << endl;
wcout << "The result is " << t.get() << endl;
}
上述代码的输出将是
创建任务
任务运行
结果是42
如果您注释掉t.get()
,则该任务根本不会运行。您还可以使用t.wait()
强制执行任务。