Implement merge_sort with multiprocessing solution












-1















I tried to write a merge sort with multiprocessing solution



from heapq import merge
from multiprocessing import Process

def merge_sort1(m):
if len(m) < 2:
return m

middle = len(m) // 2
left = Process(target=merge_sort1, args=(m[:middle],))
left.start()
right = Process(target=merge_sort1, args=(m[middle:],))
right.start()
for p in (left, right):
p.join()
result = list(merge(left, right))
return result


Test it with arr



In [47]: arr = list(range(9))                                                                                   
In [48]: random.shuffle(arr)


It repost error:



In [49]: merge_sort1(arr)                                                                                       
TypeError: 'Process' object is not iterable


What's the problem with my code?










share|improve this question



























    -1















    I tried to write a merge sort with multiprocessing solution



    from heapq import merge
    from multiprocessing import Process

    def merge_sort1(m):
    if len(m) < 2:
    return m

    middle = len(m) // 2
    left = Process(target=merge_sort1, args=(m[:middle],))
    left.start()
    right = Process(target=merge_sort1, args=(m[middle:],))
    right.start()
    for p in (left, right):
    p.join()
    result = list(merge(left, right))
    return result


    Test it with arr



    In [47]: arr = list(range(9))                                                                                   
    In [48]: random.shuffle(arr)


    It repost error:



    In [49]: merge_sort1(arr)                                                                                       
    TypeError: 'Process' object is not iterable


    What's the problem with my code?










    share|improve this question

























      -1












      -1








      -1








      I tried to write a merge sort with multiprocessing solution



      from heapq import merge
      from multiprocessing import Process

      def merge_sort1(m):
      if len(m) < 2:
      return m

      middle = len(m) // 2
      left = Process(target=merge_sort1, args=(m[:middle],))
      left.start()
      right = Process(target=merge_sort1, args=(m[middle:],))
      right.start()
      for p in (left, right):
      p.join()
      result = list(merge(left, right))
      return result


      Test it with arr



      In [47]: arr = list(range(9))                                                                                   
      In [48]: random.shuffle(arr)


      It repost error:



      In [49]: merge_sort1(arr)                                                                                       
      TypeError: 'Process' object is not iterable


      What's the problem with my code?










      share|improve this question














      I tried to write a merge sort with multiprocessing solution



      from heapq import merge
      from multiprocessing import Process

      def merge_sort1(m):
      if len(m) < 2:
      return m

      middle = len(m) // 2
      left = Process(target=merge_sort1, args=(m[:middle],))
      left.start()
      right = Process(target=merge_sort1, args=(m[middle:],))
      right.start()
      for p in (left, right):
      p.join()
      result = list(merge(left, right))
      return result


      Test it with arr



      In [47]: arr = list(range(9))                                                                                   
      In [48]: random.shuffle(arr)


      It repost error:



      In [49]: merge_sort1(arr)                                                                                       
      TypeError: 'Process' object is not iterable


      What's the problem with my code?







      python






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked Nov 26 '18 at 3:52









      JawSawJawSaw

      4,74911938




      4,74911938
























          1 Answer
          1






          active

          oldest

          votes


















          1














          merge(left, right) tries to merge two processes, whereas you presumably want to merge the two lists that resulted from each process. Note that return value of the function passed to Process is lost; it is a different process, not just a different thread, and you can't very easily shuffle data back to parent, so Python doesn't do that, by default. You need to be explicit and code such a channel yourself. Fortunately, there are multiprocessing datatypes to help you; for example, multiprocessing.Pipe:



          from heapq import merge
          import random
          import multiprocessing

          def merge_sort1(m, send_end=None):
          if len(m) < 2:
          result = m
          else:
          middle = len(m) // 2

          inputs = [m[:middle], m[middle:]]
          pipes = [multiprocessing.Pipe(False) for _ in inputs]
          processes = [multiprocessing.Process(target=merge_sort1, args=(input, send_end))
          for input, (recv_end, send_end) in zip(inputs, pipes)]
          for process in processes: process.start()
          for process in processes: process.join()
          results = [recv_end.recv() for recv_end, send_end in pipes]

          result = list(merge(*results))

          if send_end:
          send_end.send(result)
          else:
          return result


          arr = list(range(9))
          random.shuffle(arr)

          print(merge_sort1(arr))





          share|improve this answer

























            Your Answer






            StackExchange.ifUsing("editor", function () {
            StackExchange.using("externalEditor", function () {
            StackExchange.using("snippets", function () {
            StackExchange.snippets.init();
            });
            });
            }, "code-snippets");

            StackExchange.ready(function() {
            var channelOptions = {
            tags: "".split(" "),
            id: "1"
            };
            initTagRenderer("".split(" "), "".split(" "), channelOptions);

            StackExchange.using("externalEditor", function() {
            // Have to fire editor after snippets, if snippets enabled
            if (StackExchange.settings.snippets.snippetsEnabled) {
            StackExchange.using("snippets", function() {
            createEditor();
            });
            }
            else {
            createEditor();
            }
            });

            function createEditor() {
            StackExchange.prepareEditor({
            heartbeatType: 'answer',
            autoActivateHeartbeat: false,
            convertImagesToLinks: true,
            noModals: true,
            showLowRepImageUploadWarning: true,
            reputationToPostImages: 10,
            bindNavPrevention: true,
            postfix: "",
            imageUploader: {
            brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
            contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
            allowUrls: true
            },
            onDemand: true,
            discardSelector: ".discard-answer"
            ,immediatelyShowMarkdownHelp:true
            });


            }
            });














            draft saved

            draft discarded


















            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53474583%2fimplement-merge-sort-with-multiprocessing-solution%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown

























            1 Answer
            1






            active

            oldest

            votes








            1 Answer
            1






            active

            oldest

            votes









            active

            oldest

            votes






            active

            oldest

            votes









            1














            merge(left, right) tries to merge two processes, whereas you presumably want to merge the two lists that resulted from each process. Note that return value of the function passed to Process is lost; it is a different process, not just a different thread, and you can't very easily shuffle data back to parent, so Python doesn't do that, by default. You need to be explicit and code such a channel yourself. Fortunately, there are multiprocessing datatypes to help you; for example, multiprocessing.Pipe:



            from heapq import merge
            import random
            import multiprocessing

            def merge_sort1(m, send_end=None):
            if len(m) < 2:
            result = m
            else:
            middle = len(m) // 2

            inputs = [m[:middle], m[middle:]]
            pipes = [multiprocessing.Pipe(False) for _ in inputs]
            processes = [multiprocessing.Process(target=merge_sort1, args=(input, send_end))
            for input, (recv_end, send_end) in zip(inputs, pipes)]
            for process in processes: process.start()
            for process in processes: process.join()
            results = [recv_end.recv() for recv_end, send_end in pipes]

            result = list(merge(*results))

            if send_end:
            send_end.send(result)
            else:
            return result


            arr = list(range(9))
            random.shuffle(arr)

            print(merge_sort1(arr))





            share|improve this answer






























              1














              merge(left, right) tries to merge two processes, whereas you presumably want to merge the two lists that resulted from each process. Note that return value of the function passed to Process is lost; it is a different process, not just a different thread, and you can't very easily shuffle data back to parent, so Python doesn't do that, by default. You need to be explicit and code such a channel yourself. Fortunately, there are multiprocessing datatypes to help you; for example, multiprocessing.Pipe:



              from heapq import merge
              import random
              import multiprocessing

              def merge_sort1(m, send_end=None):
              if len(m) < 2:
              result = m
              else:
              middle = len(m) // 2

              inputs = [m[:middle], m[middle:]]
              pipes = [multiprocessing.Pipe(False) for _ in inputs]
              processes = [multiprocessing.Process(target=merge_sort1, args=(input, send_end))
              for input, (recv_end, send_end) in zip(inputs, pipes)]
              for process in processes: process.start()
              for process in processes: process.join()
              results = [recv_end.recv() for recv_end, send_end in pipes]

              result = list(merge(*results))

              if send_end:
              send_end.send(result)
              else:
              return result


              arr = list(range(9))
              random.shuffle(arr)

              print(merge_sort1(arr))





              share|improve this answer




























                1












                1








                1







                merge(left, right) tries to merge two processes, whereas you presumably want to merge the two lists that resulted from each process. Note that return value of the function passed to Process is lost; it is a different process, not just a different thread, and you can't very easily shuffle data back to parent, so Python doesn't do that, by default. You need to be explicit and code such a channel yourself. Fortunately, there are multiprocessing datatypes to help you; for example, multiprocessing.Pipe:



                from heapq import merge
                import random
                import multiprocessing

                def merge_sort1(m, send_end=None):
                if len(m) < 2:
                result = m
                else:
                middle = len(m) // 2

                inputs = [m[:middle], m[middle:]]
                pipes = [multiprocessing.Pipe(False) for _ in inputs]
                processes = [multiprocessing.Process(target=merge_sort1, args=(input, send_end))
                for input, (recv_end, send_end) in zip(inputs, pipes)]
                for process in processes: process.start()
                for process in processes: process.join()
                results = [recv_end.recv() for recv_end, send_end in pipes]

                result = list(merge(*results))

                if send_end:
                send_end.send(result)
                else:
                return result


                arr = list(range(9))
                random.shuffle(arr)

                print(merge_sort1(arr))





                share|improve this answer















                merge(left, right) tries to merge two processes, whereas you presumably want to merge the two lists that resulted from each process. Note that return value of the function passed to Process is lost; it is a different process, not just a different thread, and you can't very easily shuffle data back to parent, so Python doesn't do that, by default. You need to be explicit and code such a channel yourself. Fortunately, there are multiprocessing datatypes to help you; for example, multiprocessing.Pipe:



                from heapq import merge
                import random
                import multiprocessing

                def merge_sort1(m, send_end=None):
                if len(m) < 2:
                result = m
                else:
                middle = len(m) // 2

                inputs = [m[:middle], m[middle:]]
                pipes = [multiprocessing.Pipe(False) for _ in inputs]
                processes = [multiprocessing.Process(target=merge_sort1, args=(input, send_end))
                for input, (recv_end, send_end) in zip(inputs, pipes)]
                for process in processes: process.start()
                for process in processes: process.join()
                results = [recv_end.recv() for recv_end, send_end in pipes]

                result = list(merge(*results))

                if send_end:
                send_end.send(result)
                else:
                return result


                arr = list(range(9))
                random.shuffle(arr)

                print(merge_sort1(arr))






                share|improve this answer














                share|improve this answer



                share|improve this answer








                edited Nov 26 '18 at 4:28

























                answered Nov 26 '18 at 4:10









                AmadanAmadan

                133k13146197




                133k13146197
































                    draft saved

                    draft discarded




















































                    Thanks for contributing an answer to Stack Overflow!


                    • Please be sure to answer the question. Provide details and share your research!

                    But avoid



                    • Asking for help, clarification, or responding to other answers.

                    • Making statements based on opinion; back them up with references or personal experience.


                    To learn more, see our tips on writing great answers.




                    draft saved


                    draft discarded














                    StackExchange.ready(
                    function () {
                    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53474583%2fimplement-merge-sort-with-multiprocessing-solution%23new-answer', 'question_page');
                    }
                    );

                    Post as a guest















                    Required, but never shown





















































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown

































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown







                    Popular posts from this blog

                    Costa Masnaga

                    Fotorealismo

                    Sidney Franklin