今北産業
マルチスレッド処理を扱うプログラミング言語に関して、
チューリング完全性よりも強い(?)計算可能な範囲の概念がありそう
誰か教えてくれないかな
事の発端
Qiitaの画像アップロード機能も簡単に実装できる。そう、S3ならね。
を読んでいて、ふと気になったことがありました。
クライアント側で沢山のファイルをエラーにならないように気をつけて投げるにはどうすればよいのかな、と。
結論から言うと、type="file"のinputに対してmultipleを指定して、てきとうに同じ処理を繰り返せばよいです。
<script>
$(function(){
var fileInput = $('input[type="file"]');
fileInput.on('change', function (e) {
uploadFileRecursive(e, 0);
});
});
function uploadFileRecursive(e, i){
var file = e.target.files[i];
$.ajax({
url: '/policies',
type: 'POST',
dataType: 'json'
}).done(function (data) {
var name, fd = new FormData();
for (name in data.form) if (data.form.hasOwnProperty(name)) {
fd.append(name, data.form[name]);
}
fd.append('file', file);
var xhr = new XMLHttpRequest();
xhr.open('POST', data.url, false);
xhr.send(fd);
if (i + 1 < e.target.files.length) {
uploadFileRecursive(e, i + 1);
}
});
}
</script>
<input type="file" multiple></input>
「てきとうに」と書いたのですが、仮にforで普通のループを書いたりすると、ほぼ同時に沢山のリクエストを投げる事になってしまいます。それを回避する楽なやり方は無いかなーと思って、素朴に思いついたのはコールバックで再帰呼び出しをさせるということでした。
そこで気になったのが、コールバックは意味論的にforとifで書けるのかしら、ということ。(実装レベルでIOをループで待つ、というようなことをせずに、意味論的な話で)
例えば、brainf**kとかOok!やwhitespaceみたいなものでは、原理的にコールバックを書けないんじゃないかな、と思いました。
この処理の本質はajaxがasyncであるということで、マルチスレッド処理のできるプログラミング言語の意味論を考えると、チューリング完全よりも表現力の強い(?)ものが何かありそうだな、というようなことを思いました。
また、こういう計算を許すと、計算量がある程度多い問題でも短時間で解ける可能性があります。例えば、この例では敢えて直列的に計算するためコールバックを通していますが、forを使った場合、処理が滞りなく実行される前提だと時間は短くなります。(当然、メモリやCPU等のリソースを莫大に使う可能性はありますが、、、)
そういう話の詳しい資料とかあったら、おしえてください!(mapreduceの仕組みとかではなくて、プログラム意味論的な話で。コールバックの処理の中身は、ひょっとすると意味論では言及しないのが一般的なのかもしれないですが、、、)