LoginSignup
1
4

More than 5 years have passed since last update.

【ポエム】チューリング完全性とマルチスレッド処理

Last updated at Posted at 2017-01-12

今北産業

マルチスレッド処理を扱うプログラミング言語に関して、
チューリング完全性よりも強い(?)計算可能な範囲の概念がありそう
誰か教えてくれないかな

事の発端

Qiitaの画像アップロード機能も簡単に実装できる。そう、S3ならね。
を読んでいて、ふと気になったことがありました。
クライアント側で沢山のファイルをエラーにならないように気をつけて投げるにはどうすればよいのかな、と。
結論から言うと、type="file"のinputに対してmultipleを指定して、てきとうに同じ処理を繰り返せばよいです。

something.html
<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の仕組みとかではなくて、プログラム意味論的な話で。コールバックの処理の中身は、ひょっとすると意味論では言及しないのが一般的なのかもしれないですが、、、)

1
4
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
4