パラメーター
最終更新日 :
2023年10月30日
説明
Future オブジェクトを返す関数。詳しくは、ColdFusion の非同期プログラミングを参照してください。
戻り値
Future オブジェクト。
シンタックス
RunAsync() RunAsync(UDFMethod function) RunAsync(UDFMethod function, long timeOut)
履歴
ColdFusion(2018 リリース)の新機能。
パラメーター
|
|
必須/オプション |
説明 |
|---|---|---|
|
function |
オプション |
オブジェクトを返すクロージャ関数。実行の結果、ステータスなどを格納します。 |
|
timeOut |
オプション |
タイムアウト(ミリ秒)。 |
例 1
<cfscript>
//関数を非同期に実行して結果を取得する場合
future = runAsync(function(){
return "Hello World!";
});
result = future;
writeOutput(result.get());
</cfscript>
例 2
この例では、2 つのメソッドをチェーン化し結果を表示する方法を示します。
<cfscript>
// URL から応答を取得する関数を定義
function fetchResponseFromURL(url) {
result = "";
httpService = new http(method = "GET", charset = "utf-8", url = url);
httpService.addParam(name = "q", type = "url", value = "cfml");
result = httpService.send().getPrefix();
writeDump(result);
return result;
}
// 応答を取得したら、処理を実行(ここでは JSON を逆シリアル化するだけ)
future = runAsync(function(){
return fetchResponseFromUrl("http://date.jsontest.com/");
}).then( function(input){
return deserializeJson(input.FileContent)
});
result = future.get()
writedump(result);
</cfscript>
出力
例 3
この例では、メールと SMS を送信する非同期関数を定義したノンブロッキングシナリオを示します。
<cfscript>
// メールを送信する非同期関数を定義
function sendEmailAsync(toAddress, subject, body) {
cfmail(to=toAddress, subject=subject, body=body, type="html");
}
// SMS を送信する非同期関数を定義
function sendSmsAsync(phoneNumber, message) {
// 次の行を実際の SMS 送信ロジックに置き換え
// 例:sendSmsFunction(phoneNumber, message);
}
// 実世界のようなデータを持つ受信者のリスト
recipients = [
{ email: "recipient1@example.com", phone: "1234567890", subject: "Subject 1", body: "Body 1" },
{ email: "recipient2@example.com", phone: "0987654321", subject: "Subject 2", body: "Body 2" },
{ email: "recipient3@example.com", phone: "5555555555", subject: "Subject 3", body: "Body 3" },
{ email: "recipient4@example.com", phone: "6666666666", subject: "Subject 4", body: "Body 4" },
{ email: "recipient5@example.com", phone: "7777777777", subject: "Subject 5", body: "Body 5" },
{ email: "recipient6@example.com", phone: "8888888888", subject: "Subject 6", body: "Body 6" },
{ email: "recipient7@example.com", phone: "9999999999", subject: "Subject 7", body: "Body 7" },
{ email: "recipient8@example.com", phone: "1010101010", subject: "Subject 8", body: "Body 8" },
{ email: "recipient9@example.com", phone: "2020202020", subject: "Subject 9", body: "Body 9" },
{ email: "recipient10@example.com", phone: "3030303030", subject: "Subject 10", body: "Body 10" }
];
// 受信者ごとにメール送信プロセスを非同期的に開始
for (var i = 1; i <= arrayLen(recipients); i++) {
var recipient = recipients[i];
runAsync(function() {
sendEmailAsync(recipient.email, recipient.subject, recipient.body);
});
}
// 受信者ごとに SMS 送信プロセスを非同期的に開始
for (var i = 1; i <= arrayLen(recipients); i++) {
var recipient = recipients[i];
runAsync(function() {
sendSmsAsync(recipient.phone, "SMS message content");
});
}
// 次のコードはメールおよび SMS 送信プロセスの完了を待たずに直ちに実行される
writeOutput("メインスレッドでは...<br>");
</cfscript>
例 4
この例では、runAsync を使用した並列処理の方法を示しています。最初の 10,000,000 個のフィボナッチ数列を生成すると共に、行列の乗算も実行します。
<cfscript>
// タスク 1
fibonacciTask = runAsync(function(){
// 最初の 10,000,000 個のフィボナッチ数列を生成
fib = [0, 1];
for (var i = 3; i < 10000000; i++) {
fib[i] = fib[i-1] + fib[i-2];
}
return fib;
});
// タスク 2
matrixMultiplicationTask = runAsync(function(){
var matrix1 = [];
var matrix2 = [];
var result = [];
// ランダム行列を生成(簡単にするために、値が 1~10 の範囲にあると仮定)
for (var i = 1; i <= 200; i++) {
matrix1[i] = [];
matrix2[i] = [];
result[i] = [];
for (var j = 1; j <= 200; j++) {
matrix1[i][j] = randRange(1, 10);
matrix2[i][j] = randRange(1, 10);
}
}
// 行列を乗算
for (var i = 1; i <= 200; i++) {
for (var j = 1; j <= 200; j++) {
result[i][j] = 0;
for (var k = 1; k <= 200; k++) {
result[i][j] = result[i][j] + matrix1[i][k] * matrix2[k][j];
}
}
}
return result;
});
// タスク 3
sleepingTask = runAsync(function(){
sleep(9000);
});
writedump(fibonacciTask.get());
writedump(matrixMultiplicationTask.get());
writedump(sleepingTask.get());
</cfscript>
例 5
この例では、runAsync を使用した並列処理の方法を示しています。数値が素数であるかどうかを調べる関数や素数の合計を計算する関数を定義し、素数の合計を計算する複数の非同期タスクを並列に開始します。
<cfscript>
// 数値が素数であるかどうかを調べる関数
function isPrime(num) {
if (num <= 1) return false;
if (num <= 3) return true;
if (num MOD 2 EQ 0 OR num MOD 3 EQ 0) return false;
var i = 5;
while (i * i <= num) {
if (num MOD i EQ 0 OR num MOD (i + 2) EQ 0) return false;
i = i + 6;
}
return true;
}
// 素数の合計を計算する関数
function calculatePrimeSum(start, end) {
var sum = 0;
for (var i = start; i <= end; i++) {
if (isPrime(i)) {
sum = sum + i;
}
}
return sum;
}
// 素数計算の範囲を定義
startRange = 1;
endRange = 10000;
// 素数の合計を計算する複数の非同期タスクを並列に開始
task1Id = runAsync(function() {
result1 = calculatePrimeSum(startRange, 2500);
return result1;
});
task2Id = runAsync(function() {
result2 = calculatePrimeSum(2501, 5000);
return result2;
});
task3Id = runAsync(function() {
result3 = calculatePrimeSum(5001, 7500);
return result3;
});
task4Id = runAsync(function() {
result4 = calculatePrimeSum(7501, endRange);
return result4;
});
// 次のコードは非同期タスクの完了を待たずに直ちに実行される
writeOutput("メインスレッドでは...<br>...<br>");
writeDump(var=task1Id.get(), label="Task 1 ID");
writeDump(var=task2Id.get(), label="Task 2 ID");
writeDump(var=task3Id.get(), label="Task 3 ID");
writeDump(var=task4Id.get(), label="Task 4 ID");
</cfscript>
出力
メインスレッドでは...
...
420812 1127324 1749901 2438359