Upgrade to Pro — share decks privately, control downloads, hide ads and more …

並列処理で消耗しているかたへ - Snidel のご紹介 -

並列処理で消耗しているかたへ - Snidel のご紹介 -

Akihito Nakano

July 20, 2016
Tweet

More Decks by Akihito Nakano

Other Decks in Programming

Transcript

  1. 4OJEFMͷ͝঺հ
    த໺ڿਓ(.01&1"#0JOD
    1)1#-5
    ฒྻॲཧͰফ໣͍ͯ͠Δ͔ͨ΁

    View Slide

  2. 8ΞϓϦέʔγϣϯΤϯδχΞ
    άϯϚʔ
    த໺ڿਓ ͖͋ͬʔ
    !/","/[email protected]"LJIJUP
    &$ࣄۀ෦Χϥʔϛʔγϣοϓάϧʔϓ
    IUUQBDLJOUPTIHJUIVCJP

    View Slide

  3. Χϥʔϛʔγϣοϓ

    View Slide

  4. ফ໣͍ͯ͠·ͤΜ͔ʁ

    View Slide

  5. View Slide

  6. View Slide

  7. ऴΘΒͳ͍

    View Slide

  8. ύϥͰ࣮ߦ͍ͨ͠

    View Slide

  9. Ͳ͏͢Δ
    [email protected]
    [email protected]
    wQUISFBE֦ு
    wόοΫάϥ΢ϯυ
    wλεΫΩϡʔΠϯά
    wଞͷݴޠΛซ༻͢Δ
    wଞͷݴޠͰॻ͖ͳ͓͢
    ʜ

    View Slide

  10. ΘΓͱݫ͍͠

    View Slide

  11. 4OJEFMͷ͝঺հ

    View Slide

  12. 4OJEFM εφΠσϧ

    IUUQTHJUIVCDPNBDLJOUPTITOJEFM
    खܰʹϚϧνϓϩηεͰ͖Δ
    ࢠϓϩηεͷॲཧ݁ՌΛड͚औΕΔ
    ϚελʔʗϫʔΧʔϞσϧ
    1)1Ҏ্

    View Slide

  13. खܰʹϚϧνϓϩηεͰ͖Δ

    View Slide

  14. खܰʹϚϧνϓϩηεͰ͖Δ
    $snidel = new Snidel($concurrency = 5);

    View Slide

  15. खܰʹϚϧνϓϩηεͰ͖Δ
    $snidel = new Snidel($concurrency = 5);
    $sleep = function () { sleep(3); };

    View Slide

  16. खܰʹϚϧνϓϩηεͰ͖Δ
    $snidel = new Snidel($concurrency = 5);
    $sleep = function () { sleep(3); };
    $snidel->fork($sleep);
    $snidel->fork($sleep);

    View Slide

  17. खܰʹϚϧνϓϩηεͰ͖Δ
    $snidel = new Snidel($concurrency = 5);
    $sleep = function () { sleep(3); };
    $snidel->fork($sleep);
    $snidel->fork($sleep);
    $snidel->wait();

    View Slide

  18. खܰʹϚϧνϓϩηεͰ͖Δ
    $snidel = new Snidel($concurrency = 5);
    $sleep = function () { sleep(3); };
    $snidel->fork($sleep);
    $snidel->fork($sleep);
    $snidel->wait();// 3ඵͰ͓ΘΔ

    View Slide

  19. खܰʹϚϧνϓϩηεͰ͖Δ
    // ແ໊ؔ਺
    $snidel->fork($f, ‘arg');
    // άϩʔόϧؔ਺
    $snidel->fork('strtoupper', ‘php’);
    // Πϯελϯεϝιου
    $snidel->fork([$instance, ‘method’], [‘arg1’, ’arg2’]);
    // ελςΟοΫϝιου
    $snidel->fork([‘\FooClass’, ‘method’], [‘arg1’, ’arg2’]);

    View Slide

  20. View Slide

  21. ࢠϓϩηεͷॲཧ݁ՌΛड͚औΕΔ

    View Slide

  22. ࢠϓϩηεͷॲཧ݁ՌΛड͚औΕΔ
    $f = function ($arg) { return $arg; };

    View Slide

  23. ࢠϓϩηεͷॲཧ݁ՌΛड͚औΕΔ
    $f = function ($arg) { return $arg; };
    $snidel->fork($f, 'foo');
    $snidel->fork($f, 'bar');
    $snidel->fork($f, 'baz');

    View Slide

  24. ࢠϓϩηεͷॲཧ݁ՌΛड͚औΕΔ
    $f = function ($arg) { return $arg; };
    $snidel->fork($f, 'foo');
    $snidel->fork($f, 'bar');
    $snidel->fork($f, 'baz');
    var_dump($snidel->get()->toArray());

    View Slide

  25. ࢠϓϩηεͷॲཧ݁ՌΛड͚औΕΔ
    $f = function ($arg) { return $arg; };
    $snidel->fork($f, 'foo');
    $snidel->fork($f, 'bar');
    $snidel->fork($f, 'baz');
    var_dump($snidel->get()->toArray());
    array(3) {
    [0] =>
    string(3) "bar"
    [1] =>
    string(3) “foo"
    [2] =>
    string(3) "baz"
    }

    View Slide

  26. ࢠϓϩηεͷॲཧ݁ՌΛड͚औΕΔ
    $f = function ($arg) { return $arg; };
    $snidel->fork($f, 'foo');
    $snidel->fork($f, 'bar');
    $snidel->fork($f, 'baz');
    var_dump($snidel->get()->toArray());
    array(3) {
    [0] =>
    string(3) "bar"
    [1] =>
    string(3) “foo"
    [2] =>
    string(3) "baz"
    }
    ˞݁Ռͷॱং͸อূ͞Εͳ͍

    View Slide

  27. λά෇͚͢Δ

    View Slide

  28. ॲཧ݁ՌΛλά෇͚͢Δ
    // ୈ̏Ҿ਺ʹλάΛࢦఆ͢Δ
    $snidel->fork($f, ‘foo’, ‘tag1’);
    $snidel->fork($f, ‘bar’, ‘tag1’);
    $snidel->fork($f, ‘baz’, ‘tag2’);

    View Slide

  29. ॲཧ݁ՌΛλά෇͚͢Δ
    // ୈ̏Ҿ਺ʹλάΛࢦఆ͢Δ
    $snidel->fork($f, ‘foo’, ‘tag1’);
    $snidel->fork($f, ‘bar’, ‘tag1’);
    $snidel->fork($f, ‘baz’, ‘tag2’);
    var_dump($snidel->get('tag1')->toArray());

    View Slide

  30. ॲཧ݁ՌΛλά෇͚͢Δ
    // ୈ̏Ҿ਺ʹλάΛࢦఆ͢Δ
    $snidel->fork($f, ‘foo’, ‘tag1’);
    $snidel->fork($f, ‘bar’, ‘tag1’);
    $snidel->fork($f, ‘baz’, ‘tag2’);
    var_dump($snidel->get('tag1')->toArray());
    array(2) {
    [0]=>
    string(3) "foo"
    [1]=>
    string(3) "bar"
    }

    View Slide

  31. ͦͷଞͷػೳ

    View Slide

  32. ͦͷଞͷػೳ ϩά

    $fp = fopen('php://stdout', ‘w’);
    $snidel->setLogDestination($fp);
    $snidel->fork($f);

    View Slide

  33. ͦͷଞͷػೳ ϩά

    $fp = fopen('php://stdout', ‘w’);
    $snidel->setLogDestination($fp);
    $snidel->fork($f);
    [2016-07-20 20:00:00][info][29688(owner)] pid: 29688
    [2016-07-20 20:00:00][info][29689(master)] pid: 29689
    [2016-07-20 20:00:00][info][29688(owner)] queued task #1
    [2016-07-20 20:00:00][info][29688(owner)] queued task #2
    [2016-07-20 20:00:00][info][29689(master)] dequeued task #1
    [2016-07-20 20:00:00][info][29689(master)] forked worker. pid: 29690

    View Slide

  34. ͦͷଞͷػೳ ͭͳ࣮͛ͯߦ

    $args = ['aaa', ‘bbb’, ‘ccc’, ‘ddd’, ‘eee’, ‘fff’, 'ggg'];

    View Slide

  35. ͦͷଞͷػೳ ͭͳ࣮͛ͯߦ

    $args = ['aaa', ‘bbb’, ‘ccc’, ‘ddd’, ‘eee’, ‘fff’, 'ggg'];
    $snidel = new Snidel($concurrency = 2);

    View Slide

  36. ͦͷଞͷػೳ ͭͳ࣮͛ͯߦ

    $args = ['aaa', ‘bbb’, ‘ccc’, ‘ddd’, ‘eee’, ‘fff’, 'ggg'];
    $snidel = new Snidel($concurrency = 2);
    $camelize = $snidel->map($args, function ($arg) {
    /** ॲཧ1 */
    return explode(' ', strtolower($arg));
    })->then(function ($result) {
    /** ॲཧ2 */
    return array_map('ucfirst', $result->getReturn());
    })->then(function ($result) {
    /** ॲཧ3 */
    return implode('', $result->getReturn());
    });

    View Slide

  37. ͦͷଞͷػೳ ͭͳ࣮͛ͯߦ

    $args = ['aaa', ‘bbb’, ‘ccc’, ‘ddd’, ‘eee’, ‘fff’, 'ggg'];
    $snidel = new Snidel($concurrency = 2);
    $camelize = $snidel->map($args, function ($arg) {
    /** ॲཧ1 */
    return explode(' ', strtolower($arg));
    })->then(function ($result) {
    /** ॲཧ2 */
    return array_map('ucfirst', $result->getReturn());
    })->then(function ($result) {
    /** ॲཧ3 */
    return implode('', $result->getReturn());
    });
    var_dump($snidel->run($camelize));

    View Slide

  38. ಈ࡞Πϝʔδ
    IUUQTWJNFPDPN

    View Slide

  39. ͦͷଞͷػೳ ͭͳ࣮͛ͯߦ

    $args = ['aaa', ‘bbb’, ‘ccc’, ‘ddd’, ‘eee’, ‘fff’, 'ggg'];
    $snidel = new Snidel($concurrency = 2);
    $camelize = $snidel->map($args, function ($arg) {
    /** ॲཧ1 */
    return explode(' ', strtolower($arg));
    })->then(function ($result) {
    /** ॲཧ2 */
    return array_map('ucfirst', $result->getReturn());
    })->then(function ($result) {
    /** ॲཧ3 */
    return implode('', $result->getReturn());
    });
    var_dump($snidel->run($camelize));
    ࣍ͷόʔδϣϯͰ࡟আ༧ఆ
    ݸผͷϥΠϒϥϦʹ

    View Slide

  40. ·ͱΊ

    View Slide

  41. ฒྻॲཧͰফ໣͍ͯ͠Δਓ͸
    Snidel Λ࢖ͬͨΒ޾ͤʹͳΕΔ͔΋

    View Slide

  42. ϓϧϦΫΤετ׻ܴʂ
    IUUQTHJUIVCDPNBDLJOUPTITOJEFM

    View Slide

  43. ܅΋ϖύϘͰಇ͔ͳ͍͔ʁ
    ࠷৽ͷ࠾༻৘ใΛνΣοΫˠ [email protected]

    View Slide

  44. View Slide