আমি কীভাবে একটি সাধারণ পাইথন লুপটির সমান্তরাল করব?


255

এটি সম্ভবত একটি তুচ্ছ প্রশ্ন, তবে আমি কীভাবে পাইথনের নীচের লুপটির সমান্তরাল করব?

# setup output lists
output1 = list()
output2 = list()
output3 = list()

for j in range(0, 10):
    # calc individual parameter value
    parameter = j * offset
    # call the calculation
    out1, out2, out3 = calc_stuff(parameter = parameter)

    # put results into correct output list
    output1.append(out1)
    output2.append(out2)
    output3.append(out3)

পাইথনে কীভাবে একক থ্রেড শুরু করতে হয় তা আমি জানি তবে কীভাবে ফলাফল "সংগ্রহ" করা যায় তা আমি জানি না।

একাধিক প্রক্রিয়াগুলিও ঠিকঠাক হবে - যা এই ক্ষেত্রে সবচেয়ে সহজ। আমি বর্তমানে লিনাক্স ব্যবহার করছি তবে কোডটি উইন্ডোজ এবং ম্যাকেও চালানো উচিত।

এই কোডটির সমান্তরাল করার সহজতম উপায় কী?

উত্তর:


191

সিপিথনে একাধিক থ্রেড ব্যবহার করা গ্লোবাল ইন্টারপ্রেটার লক (জিআইএল) এর কারণে খাঁটি-পাইথন কোডের জন্য আপনাকে আরও ভাল পারফরম্যান্স দেবে না। আমি multiprocessingপরিবর্তে মডিউলটি ব্যবহার করার পরামর্শ দিচ্ছি :

pool = multiprocessing.Pool(4)
out1, out2, out3 = zip(*pool.map(calc_stuff, range(0, 10 * offset, offset)))

মনে রাখবেন যে এটি ইন্টারেক্টিভ দোভাষীটিতে কাজ করবে না।

জিআইএল এর চারপাশে স্বাভাবিক এফইউডি এড়ানোর জন্য: যাইহোক এই উদাহরণের জন্য থ্রেড ব্যবহার করার কোনও সুবিধা হবে না। আপনি থ্রেডগুলি না দিয়ে এখানে প্রক্রিয়াগুলি ব্যবহার করতে চান কারণ তারা পুরো সমস্যাগুলি এড়িয়ে চলে।


46
যেহেতু এটি নির্বাচিত উত্তর, তাই এর আরও ব্যাপক উদাহরণ দেওয়া কি সম্ভব? কি যুক্তি আছে calc_stuff?
এডুয়ার্ডো পিগনেটেলি

2
@ এডুয়ার্ডোপিগনেটেলি multiprocessingআরও বিস্তৃত উদাহরণের জন্য দয়া করে মডিউলটির ডকুমেন্টেশনটি পড়ুন । Pool.map()মূলত মত কাজ করে map(), তবে সমান্তরালে।
সোভেন মারনাচ

3
কোডের এই কাঠামোটিতে কেবল একটি tqdm লোডিং বারে যুক্ত করার কোনও উপায় আছে? আমি টিকিডিএম (পুল.আইম্যাপ (ক্যালক_স্টফ, রেঞ্জ (0, 10 * অফসেট, অফসেট))) ব্যবহার করেছি তবে আমি পুরো লোডিং বার গ্রাফিক পাই না।
ব্যবহারকারী 8188120

@ user8188120 আমি tqdm এর আগে কখনও শুনিনি, তাই দুঃখিত, আমি এটিতে সহায়তা করতে পারি না।
সোভেন মারনাচ

একটি টিকিডিএম লোডিং বারের জন্য এই প্রশ্নটি দেখুন: stackoverflow.com/questions/41920124/…
জোহানেস

66

লুপের জন্য একটি সাধারণকে সমান্তরাল করতে, জবলিব মাল্টিপ্রসেসিংয়ের কাঁচা ব্যবহারের জন্য প্রচুর মান নিয়ে আসে। কেবল সংক্ষিপ্ত বাক্য গঠন নয়, ত্রুটি প্রতিবেদন করার জন্য, যখন তারা খুব দ্রুত হয় (ওভারহেড অপসারণ করতে) বা শিশু প্রক্রিয়াটির ট্রেসব্যাক ক্যাপচার করার সময় স্বচ্ছ পুনরাবৃত্তির মতো জিনিসগুলি।

দাবি অস্বীকার: আমি জবলিবের মূল লেখক।


1
আমি জুপিটার দিয়ে জবলিব চেষ্টা করেছি, এটি কাজ করছে না। সমান্তরাল-বিলম্বিত কলের পরে, পৃষ্ঠাটি কাজ করা বন্ধ করে দিয়েছে।
জিই

1
হাই, আমি joblib (ব্যবহার একটি সমস্যা আছে stackoverflow.com/questions/52166572/... ), আপনি কোনো খেই কি কারণ হতে পারে না? অনেক ধন্যবাদ.
টিং সূর্য

এমন কিছু মনে হচ্ছে যা আমি শট দিতে চাই! ডাবল লুপের সাহায্যে যেমন এটি ব্যবহার করা সম্ভব যেমন আমার পরিসীমা (10): জে রেঞ্জের জন্য (20)
কিউটপোইজন

51

এই কোডটির সমান্তরাল করার সহজতম উপায় কী?

আমি concurrent.futuresএটির জন্য সত্যই পছন্দ করি , এটি পাইথন 3 এ সংস্করণ 3.2 থেকে পাওয়া যায় - এবং পিপিআইতে ব্যাকপোর্টের মাধ্যমে 2.6 এবং 2.7 এ যায়

আপনি থ্রেড বা প্রক্রিয়া ব্যবহার করতে পারেন এবং ঠিক একই ইন্টারফেস ব্যবহার করতে পারেন।

মাল্টিপ্রসেসিং

এটিকে একটি ফাইলে রাখুন - ਭਵਿੱਖেস্টেস্ট.পি:

import concurrent.futures
import time, random               # add some random sleep time

offset = 2                        # you don't supply these so
def calc_stuff(parameter=None):   # these are examples.
    sleep_time = random.choice([0, 1, 2, 3, 4, 5])
    time.sleep(sleep_time)
    return parameter / 2, sleep_time, parameter * parameter

def procedure(j):                 # just factoring out the
    parameter = j * offset        # procedure
    # call the calculation
    return calc_stuff(parameter=parameter)

def main():
    output1 = list()
    output2 = list()
    output3 = list()
    start = time.time()           # let's see how long this takes

    # we can swap out ProcessPoolExecutor for ThreadPoolExecutor
    with concurrent.futures.ProcessPoolExecutor() as executor:
        for out1, out2, out3 in executor.map(procedure, range(0, 10)):
            # put results into correct output list
            output1.append(out1)
            output2.append(out2)
            output3.append(out3)
    finish = time.time()
    # these kinds of format strings are only available on Python 3.6:
    # time to upgrade!
    print(f'original inputs: {repr(output1)}')
    print(f'total time to execute {sum(output2)} = sum({repr(output2)})')
    print(f'time saved by parallelizing: {sum(output2) - (finish-start)}')
    print(f'returned in order given: {repr(output3)}')

if __name__ == '__main__':
    main()

এবং আউটপুট এখানে:

$ python3 -m futuretest
original inputs: [0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0]
total time to execute 33 = sum([0, 3, 3, 4, 3, 5, 1, 5, 5, 4])
time saved by parallellizing: 27.68999981880188
returned in order given: [0, 4, 16, 36, 64, 100, 144, 196, 256, 324]

Multithreading

এখন পরিবর্তন ProcessPoolExecutorকরুন ThreadPoolExecutorএবং আবার মডিউল চালান:

$ python3 -m futuretest
original inputs: [0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0]
total time to execute 19 = sum([0, 2, 3, 5, 2, 0, 0, 3, 3, 1])
time saved by parallellizing: 13.992000102996826
returned in order given: [0, 4, 16, 36, 64, 100, 144, 196, 256, 324]

এখন আপনি মাল্টিথ্রেডিং এবং মাল্টিপ্রসেসিং উভয়ই করেছেন!

পারফরম্যান্স এবং উভয় একসাথে ব্যবহার নেভিগেশন নোট।

ফলাফলের তুলনা করার জন্য স্যাম্পলিং অনেক ছোট।

তবে আমি সন্দেহ করি যে মাল্টিথ্রেডিং সাধারণত মাল্টিপ্রসেসিংয়ের চেয়ে দ্রুততর হবে, বিশেষত উইন্ডোজে, যেহেতু উইন্ডোজ কাঁটাচামচ সমর্থন করে না তাই প্রতিটি নতুন প্রক্রিয়া চালু হওয়ার জন্য সময় নিতে হবে। লিনাক্স বা ম্যাক এ তারা সম্ভবত আরও কাছাকাছি থাকবে।

আপনি একাধিক প্রক্রিয়ার অভ্যন্তরে একাধিক থ্রেড বাসাতে পারেন তবে একাধিক প্রক্রিয়া বন্ধ করতে একাধিক থ্রেড ব্যবহার না করার পরামর্শ দেওয়া হচ্ছে recommended


থ্রেডপুলএক্সেক্টর জিআইএল দ্বারা আরোপিত সীমাবদ্ধতাগুলি বাইপাস করে? এক্সিকিউটিউটরদের শেষ হওয়ার জন্য অপেক্ষা করার জন্য
আপনাকেও

1
না এবং না, হ্যাঁ "স্পষ্টভাবে পরিচালিত"
অ্যারোন হল

কোনও কারণে, সমস্যাটি বাড়ানোর সময়, মাল্টিথ্রিডিং অত্যন্ত দ্রুত হয়, তবে একাধিক প্রসেসিং একগুচ্ছ আটকে থাকা প্রক্রিয়াগুলি (ম্যাকোজে) তৈরি করে। কোন ধারণা কেন হতে পারে? প্রক্রিয়াটিতে কেবল নেস্টেড লুপ এবং গণিত রয়েছে, বহিরাগত কিছুই নয়।
কমোডোভরণ_

@ কমডোভরান_ একটি প্রক্রিয়া একটি সম্পূর্ণ পাইথন প্রক্রিয়া, প্রতি এক একটি, যখন একটি থ্রেড কেবল তার নিজস্ব স্ট্যাকের সাথে মৃত্যুদন্ড কার্যকর করার একটি থ্রেড যা প্রক্রিয়া ভাগ করে, তার বাইটোকোড এবং অন্যান্য সমস্ত থ্রেডের সাথে স্মৃতিতে এটি রয়েছে সমস্ত কিছু - যে সাহায্য করে ?
হারুন হলের

49
from joblib import Parallel, delayed
import multiprocessing

inputs = range(10) 
def processInput(i):
    return i * i

num_cores = multiprocessing.cpu_count()

results = Parallel(n_jobs=num_cores)(delayed(processInput)(i) for i in inputs)
print(results)

উপরেরগুলি আমার মেশিনে সুন্দরভাবে কাজ করে (উবুন্টু, প্যাকেজ জবলিব প্রাক-ইনস্টলড ছিল তবে এটির মাধ্যমে ইনস্টল করা যেতে পারে pip install joblib)।

Https://blog.dominodatalab.com / সরল- সমান্তরালকরণ / থেকে নেওয়া


3
আমি আপনার কোডটি চেষ্টা করেছি কিন্তু আমার সিস্টেমে এই কোডটির ক্রমিক সংস্করণটি প্রায় আধা মিনিট সময় নেয় এবং উপরের সমান্তরাল সংস্করণটি 4 মিনিট সময় নেয়। কেন এমন?
শেফালি গুপ্ত

3
আপনার উত্তরের জন্য ধন্যবাদ! আমি মনে করি এটি 2019 এ করার জন্য এটি সবচেয়ে মার্জিত উপায়
হিক্কি পুল্ককেনেন

2
পাইথন ৩.x এর জন্য মাল্টিপ্রসেসিং বৈধ নয়, সুতরাং এটি আমার পক্ষে কার্যকর হয় না।
EngrStudent

2
@ ইঙ্গারস্টুডেন্ট "বৈধ নয়" বলতে আপনার অর্থ কী তা নিশ্চিত নন। এটি আমার জন্য পাইথন 3.6.x এর জন্য কাজ করে।
tyrex

@tyrex ভাগ করে নেওয়ার জন্য ধন্যবাদ! এই জবলিব প্যাকেজটি দুর্দান্ত এবং উদাহরণটি আমার পক্ষে কাজ করে। যদিও, আরও জটিল প্রসঙ্গে আমার দুর্ভাগ্যক্রমে একটি বাগ ছিল। github.com/joblib/joblib/issues/949
ওপেন ফুড ব্রোকার

13

রে ব্যবহারের বিভিন্ন সুবিধা রয়েছে :

  • আপনি একাধিক কোর ছাড়াও একাধিক মেশিনে সমান্তরাল করতে পারেন (একই কোড সহ)।
  • ভাগ করা মেমরির (এবং শূন্য-অনুলিপি সিরিয়ালাইজেশন) মাধ্যমে অঙ্কিত ডেটাগুলির কার্যকর হ্যান্ডলিং।
  • বিতরণকারী সময়সূচী সহ উচ্চ টাস্ক থ্রুপুট।
  • ফল্ট সহনশীলতা।

আপনার ক্ষেত্রে, আপনি রে শুরু করতে এবং একটি দূরবর্তী ফাংশন সংজ্ঞায়িত করতে পারে

import ray

ray.init()

@ray.remote(num_return_vals=3)
def calc_stuff(parameter=None):
    # Do something.
    return 1, 2, 3

এবং তারপরে এটি সমান্তরালে প্রার্থনা করুন

output1, output2, output3 = [], [], []

# Launch the tasks.
for j in range(10):
    id1, id2, id3 = calc_stuff.remote(parameter=j)
    output1.append(id1)
    output2.append(id2)
    output3.append(id3)

# Block until the results have finished and get the results.
output1 = ray.get(output1)
output2 = ray.get(output2)
output3 = ray.get(output3)

একটি ক্লাস্টারে একই উদাহরণ চালানোর জন্য, একমাত্র লাইনটি পরিবর্তিত হবে তা হবে ray.init () এ কল। সম্পর্কিত ডকুমেন্টেশন এখানে পাওয়া যাবে

নোট করুন আমি রে উন্নয়নের জন্য সাহায্য করছি।


1
যে কেউ রশ্মি বিবেচনা করে, এটি জানার জন্য এটি প্রাসঙ্গিক হতে পারে যে এটি মূলত উইন্ডোজ সমর্থন করে না। উইন্ডোজ ডাব্লুএসএল (লিনাক্সের জন্য উইন্ডোজ সাবসিস্টেম) ব্যবহার করে এটি উইন্ডোতে কাজ করার জন্য কিছু হ্যাকগুলি সম্ভব, যদিও আপনি উইন্ডোজ ব্যবহার করতে চান তবে এটি খুব কমই বাক্সের বাইরে রয়েছে।
অস্কারভ্যানএল

9

এটি করার সহজ উপায় এটি!

আপনি অ্যাসিনসিও ব্যবহার করতে পারেন । (ডকুমেন্টেশন এখানে পাওয়া যাবে )। এটি একাধিক পাইথন অ্যাসিনক্রোনাস ফ্রেমওয়ার্কগুলির ভিত্তি হিসাবে ব্যবহৃত হয় যা উচ্চ-পারফরম্যান্স নেটওয়ার্ক এবং ওয়েব-সার্ভার, ডাটাবেস সংযোগ গ্রন্থাগারগুলি, বিতরণ করা টাস্কের সারি ইত্যাদি সরবরাহ করে Plus এছাড়াও এটি যে কোনও ধরণের সমস্যা সমাধানের জন্য উচ্চ-স্তরের এবং নিম্ন স্তরের উভয়ই এপিআই রয়েছে ।

import asyncio

def background(f):
    def wrapped(*args, **kwargs):
        return asyncio.get_event_loop().run_in_executor(None, f, *args, **kwargs)

    return wrapped

@background
def your_function(argument):
    #code

এখন মূল কর্মসূচি অপেক্ষার স্থানে না রেখে যখনই ডাকা হবে তখন এই ফাংশনটি সমান্তরালভাবে পরিচালিত হবে। আপনি এটি লুপের জন্য সমান্তরাল করতেও ব্যবহার করতে পারেন। লুপের জন্য যখন ডাকা হয়, লুপটি ক্রমযুক্ত হলেও প্রতিটি পুনরাবৃত্তি মূল প্রোগ্রামের সমান্তরালে চলে যায় যত তাড়াতাড়ি দোভাষী উপস্থিত হয়। এই ক্ষেত্রে:

@background
def your_function(argument):
    time.sleep(5)
    print('function finished for '+str(argument))


for i in range(10):
    your_function(i)


print('loop finished')

এটি নিম্নলিখিত আউটপুট উত্পাদন করে:

loop finished
function finished for 4
function finished for 8
function finished for 0
function finished for 3
function finished for 6
function finished for 2
function finished for 5
function finished for 7
function finished for 9
function finished for 1

আমি মনে করি একটি টাইপো আছে wrapped()এবং এটি হওয়া উচিত **kwargsপরিবর্তে*kwargs
Jakub-olczyk

ওহো! আমার ভুল. সংশোধন!
ব্যবহারকারীর 5

6

আপনি কেন বিশ্বব্যাপী তালিকার সুরক্ষার জন্য থ্রেড এবং একটি মিটেক্স ব্যবহার করবেন না?

import os
import re
import time
import sys
import thread

from threading import Thread

class thread_it(Thread):
    def __init__ (self,param):
        Thread.__init__(self)
        self.param = param
    def run(self):
        mutex.acquire()
        output.append(calc_stuff(self.param))
        mutex.release()   


threads = []
output = []
mutex = thread.allocate_lock()

for j in range(0, 10):
    current = thread_it(j * offset)
    threads.append(current)
    current.start()

for t in threads:
    t.join()

#here you have output list filled with data

মনে রাখবেন, আপনি আপনার ধীরতম সুতোর মতো দ্রুত হবে


2
আমি জানি এটি একটি খুব পুরানো উত্তর, সুতরাং কোথাও এলোমেলো ডাউনভোট পাওয়ার পক্ষে এটি একটি ঝাঁকুনি। থ্রেডগুলি কোনও কিছুর সমান্তরাল করতে পারে না বলেই আমি কেবল উজ্জীবিত হয়েছি। পাইথনের থ্রেডগুলি গ্লোবাল ইন্টারপ্রেটার লক হওয়ার কারণে একবারে দোভাষীগুলিতে কেবলমাত্র একটি থ্রেড চালিত হতে বাধ্য, সুতরাং তারা সমবর্তী প্রোগ্রামিং সমর্থন করে , তবে ওপি অনুরোধ করার সাথে সমান্তরাল নয় not
skrrgwasme

3
@ এসএসআরগ্রওয়াসেমে আমি জানি আপনি এটি জানেন, তবে আপনি যখন "তারা কোনও কিছুকেই সমান্তরাল করে তুলবেন না" শব্দটি ব্যবহার করেন যা পাঠকদের বিভ্রান্ত করতে পারে। যদি অপারেশনগুলি দীর্ঘ সময় নেয় কারণ তারা আইও আবদ্ধ হয়, বা তারা কোনও ইভেন্টের জন্য অপেক্ষা করার সময় ঘুমিয়ে থাকে, তবে দোভাষী অন্য থ্রেড চালানোর জন্য মুক্ত হয়, সুতরাং এর ফলে লোকেরা যেসব ক্ষেত্রে প্রত্যাশা করছে তার গতি বাড়বে। কেবল সিপিইউড থ্রেডই স্ক্র্রগ্রওয়াসমে যা বলে তা দ্বারা সত্যই প্রভাবিত হয়।
জোনাথন হার্টলে

5

আমি পেয়েছি আমার joblibজন্য খুব দরকারী। দয়া করে নিম্নলিখিত উদাহরণটি দেখুন:

from joblib import Parallel, delayed
def yourfunction(k):   
    s=3.14*k*k
    print "Area of a circle with a radius ", k, " is:", s

element_run = Parallel(n_jobs=-1)(delayed(yourfunction)(k) for k in range(1,10))

n_jobs = -1: সমস্ত উপলব্ধ কোর ব্যবহার করুন


14
আপনি জানেন, নিজের পোস্ট দেওয়ার আগে ইতিমধ্যে বিদ্যমান উত্তরগুলি পরীক্ষা করা ভাল। এই উত্তরটিও ব্যবহারের প্রস্তাব দেয় joblib
সান্য্যাশ

2

ধরা যাক আমাদের একটি অ্যাসিঙ্ক ফাংশন রয়েছে

async def work_async(self, student_name: str, code: str, loop):
"""
Some async function
"""
    # Do some async procesing    

এটি একটি বড় অ্যারে চালানো প্রয়োজন। কিছু বৈশিষ্ট্য প্রোগ্রামে পাস করা হচ্ছে এবং কিছু অ্যারে অভিধানের উপাদান থেকে ব্যবহৃত হয়।

async def process_students(self, student_name: str, loop):
    market = sys.argv[2]
    subjects = [...] #Some large array
    batchsize = 5
    for i in range(0, len(subjects), batchsize):
        batch = subjects[i:i+batchsize]
        await asyncio.gather(*(self.work_async(student_name,
                                           sub['Code'],
                                           loop)
                       for sub in batch))

1

এই একবার দেখুন;

http://docs.python.org/library/queue.html

এটি করার সঠিক উপায় এটি নাও হতে পারে তবে আমি এর মতো কিছু করব;

আসল কোড;

from multiprocessing import Process, JoinableQueue as Queue 

class CustomWorker(Process):
    def __init__(self,workQueue, out1,out2,out3):
        Process.__init__(self)
        self.input=workQueue
        self.out1=out1
        self.out2=out2
        self.out3=out3
    def run(self):
            while True:
                try:
                    value = self.input.get()
                    #value modifier
                    temp1,temp2,temp3 = self.calc_stuff(value)
                    self.out1.put(temp1)
                    self.out2.put(temp2)
                    self.out3.put(temp3)
                    self.input.task_done()
                except Queue.Empty:
                    return
                   #Catch things better here
    def calc_stuff(self,param):
        out1 = param * 2
        out2 = param * 4
        out3 = param * 8
        return out1,out2,out3
def Main():
    inputQueue = Queue()
    for i in range(10):
        inputQueue.put(i)
    out1 = Queue()
    out2 = Queue()
    out3 = Queue()
    processes = []
    for x in range(2):
          p = CustomWorker(inputQueue,out1,out2,out3)
          p.daemon = True
          p.start()
          processes.append(p)
    inputQueue.join()
    while(not out1.empty()):
        print out1.get()
        print out2.get()
        print out3.get()
if __name__ == '__main__':
    Main()

আশা করি এইটি কাজ করবে.


1

পাইথনে মাল্টিপ্রসেসিং এবং সমান্তরাল / বিতরিত কম্পিউটিং প্রয়োগ করার সময় এটি কার্যকর হতে পারে।

তেখিলা প্যাকেজ ব্যবহারের বিষয়ে ইউটিউব টিউটোরিয়াল

টেখিলা হ'ল একটি বিতরণকৃত কম্পিউটিং মিডলওয়্যার, যা টেচিলা প্যাকেজটি ব্যবহার করে পাইথনের সাথে সরাসরি সংহত হয়। প্যাকেজের পীচ ফাংশন লুপ স্ট্রাকচারগুলিকে সমান্তরাল করতে কার্যকর হতে পারে। (নিম্নলিখিত কোড স্নিপেটটি তেখিলা সম্প্রদায় ফোরামের থেকে রয়েছে )

techila.peach(funcname = 'theheavyalgorithm', # Function that will be called on the compute nodes/ Workers
    files = 'theheavyalgorithm.py', # Python-file that will be sourced on Workers
    jobs = jobcount # Number of Jobs in the Project
    )

1
যদিও এই লিঙ্কটি প্রশ্নের উত্তর দিতে পারে, উত্তরের প্রয়োজনীয় অংশগুলি এখানে অন্তর্ভুক্ত করা এবং রেফারেন্সের জন্য লিঙ্কটি সরবরাহ করা ভাল। লিঙ্কযুক্ত পৃষ্ঠাগুলি পরিবর্তিত হলে লিঙ্ক-শুধুমাত্র উত্তরগুলি অবৈধ হতে পারে।
এসএল বার্থ - মনিকা

2
@ এসএলবার্থ প্রতিক্রিয়ার জন্য আপনাকে ধন্যবাদ। আমি উত্তরে একটি ছোট নমুনা কোড যুক্ত করেছি।
Tee

1

ধন্যবাদ @ আইউরিক্সাভিয়ার

from multiprocessing import Pool
from multiprocessing import cpu_count


def add_1(x):
    return x + 1

if __name__ == "__main__":
    pool = Pool(cpu_count())
    results = pool.map(add_1, range(10**12))
    pool.close()  # 'TERM'
    pool.join()   # 'KILL'

2
-1। এটি একটি কোড-উত্তর মাত্র। আমি এমন একটি ব্যাখ্যা যুক্ত করার পরামর্শ দেব যা পাঠককে আপনার পোস্ট করা কোডটি কী করবে এবং সম্ভবত তারা অতিরিক্ত তথ্য সন্ধান করতে পারে সে সম্পর্কে জানিয়ে দেয়।
তারকাবিআমরনোলাবস

-1

সমান্তরাল প্রক্রিয়াকরণের খুব সাধারণ উদাহরণ হ'ল

from multiprocessing import Process

output1 = list()
output2 = list()
output3 = list()

def yourfunction():
    for j in range(0, 10):
        # calc individual parameter value
        parameter = j * offset
        # call the calculation
        out1, out2, out3 = calc_stuff(parameter=parameter)

        # put results into correct output list
        output1.append(out1)
        output2.append(out2)
        output3.append(out3)

if __name__ == '__main__':
    p = Process(target=pa.yourfunction, args=('bob',))
    p.start()
    p.join()

3
লুপের জন্য এখানে কোনও সমান্তরালতা নেই, আপনি কেবল একটি প্রক্রিয়া তৈরি করছেন যা পুরো লুপটি চালায়; ওপি এর উদ্দেশ্য কী তা নয়।
সত্য
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.