рдкрд░рд┐рдЪрдпред
рдЕрдЬрдЧрд░ рдПрдХ рдЕрджреНрднреБрдд рднрд╛рд╖рд╛ рд╣реИред рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдкрд╛рдпрдерди + рдиреНрдпреВрдкреА + рдореИрдЯрд▓реЛрдЯреНрд▓рд┐рдм рдЧреБрдЪреНрдЫрд╛, рдЕрдм рд╡реИрдЬреНрдЮрд╛рдирд┐рдХ рдЧрдгрдирд╛ рдФрд░ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рддреЗрдЬреА рд╕реЗ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рд▓реЗрдХрд┐рди рдкреНрд░рддреНрдпреЗрдХ рдЙрдкрдХрд░рдг рдХреЗ рдЕрдкрдиреЗ рдкреНрд░рдХрд╛рд╢ рдФрд░ рдЕрдВрдзреЗрд░реЗ рдкрдХреНрд╖ рд╣реИрдВред рдкрд╛рдпрдерди рдХреА рд╕рдмрд╕реЗ рдЪрд░реНрдЪрд┐рдд рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдЬреАрдЖрдИрдПрд▓ рд╣реИ - рдЧреНрд▓реЛрдмрд▓ рдЗрдВрдЯрд░рдкреНрд░реЗрдЯрд░ рд▓реЙрдХред рдореИрдВ рдЗрд╕ рдлреАрдЪрд░ рдХреЛ рдЗрдВрд╕реНрдЯреНрд░реВрдореЗрдВрдЯ рдХреЗ рдбрд╛рд░реНрдХ рд╕рд╛рдЗрдб рдореЗрдВ рджреЗрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдХрдИ рдореБрдЭрд╕реЗ рд╕рд╣рдордд рдирд╣реАрдВ рд╣реИрдВред
рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдЬреАрдЖрдИрдПрд▓ рдПрдХ рдкрд╛рдпрдерди рдЗрдВрдЯрд░рдкреНрд░реЗрдЯрд░ рдореЗрдВ рдХреБрд╢рд▓рддрд╛ рд╕реЗ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдзрд╛рдЧреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред рдЬреАрдЖрдИрдПрд▓ рдХреЗ рдЕрдзрд┐рд╡рдХреНрддрд╛рдУрдВ рдХрд╛ рддрд░реНрдХ рд╣реИ рдХрд┐ рдЬреАрдЖрдИрдПрд▓ рдХреЗ рд╕рд╛рде рдПрдХрд▓-рдереНрд░реЗрдбреЗрдб рдкреНрд░реЛрдЧреНрд░рд╛рдо рдмрд╣реБрдд рдЕрдзрд┐рдХ рдХреБрд╢рд▓рддрд╛ рд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЬреАрдЖрдИрдПрд▓ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдХрдИ рдереНрд░реЗрдб рдФрд░ рд╕рд╛рдЭрд╛ рдореЗрдореЛрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдорд╛рдирд╛рдВрддрд░ рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред рдФрд░ рдпрд╣ рдЖрдзреБрдирд┐рдХ рдорд▓реНрдЯреА-рдХреЛрд░ рджреБрдирд┐рдпрд╛ рдореЗрдВ рдХрд╛рдлреА рдордЬрдмреВрдд рд╕реАрдорд╛ рд╣реИред
рд╕реА ++ рдереНрд░реЗрдбреНрд╕ рдХреЗ рд╕рд╛рде рдЬреАрдЖрдИрдПрд▓ рдХреЛ рджреВрд░ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдПрдХ рд▓реЗрдЦ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рдереА:
рдПрдХ рдорд▓реНрдЯреАрдереНрд░реЗрдбреЗрдб рд╕реА ++ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдкрд╛рдпрдерди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ ред рдореИрдВ рдмрд╣реБрдкреНрд░рдЪрд▓рд┐рдд рдФрд░ рд╕рд╛рдЭрд╛ рд╕рд░рдгреА рдХреЗ рдЖрдзрд╛рд░ рдкрд░ GIL рдХреА рд╕реАрдорд╛рдУрдВ рдХреЛ рджреВрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рддрд░реАрдХреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдпрд╣ рд╡рд┐рдзрд┐ рдХрдИ рдереНрд░реЗрдбреНрд╕ рдФрд░ рд╕рд╛рдЭрд╛ рдХреА рдЧрдИ рдореЗрдореЛрд░реА рдХреА рдкрд╛рд░рджрд░реНрд╢реА рд╕рдорд╛рдирд╛рдВрддрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдФрд░ рд╕рд╛рдЭрд╛ рдХреА рдЧрдИ рдореЗрдореЛрд░реА рдХреЛ рдХрд╛рдлреА рд╕рд░рд▓ рдФрд░ рдХреБрд╢рд▓рддрд╛ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдВрднрд╡ рдмрдирд╛рддреА рд╣реИред
рдЯрд╛рд╕реНрдХред
рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдорд╕реНрдпрд╛ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рддреАрди-рдЖрдпрд╛рдореА рдЕрдВрддрд░рд┐рдХреНрд╖ рдореЗрдВ, рдПрди рдЕрдВрдХ v0, v1, ..., vN рджрд┐рдП рдЧрдП рд╣реИрдВред рдЙрдирдХреЗ рдмреАрдЪ рдХреА рджреВрд░реА рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреНрдпреЗрдХ рдЬреЛрдбрд╝реА рдмрд┐рдВрджреБрдУрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдкрд░рд┐рдгрд╛рдо рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ NxN рдореИрдЯреНрд░рд┐рдХреНрд╕ рд╣реЛрдЧрд╛ред рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓реЗрддреЗ рд╣реИрдВ: f = r ^ 3/12 + r ^ 2 / 6. рдпрд╣ рдкрд░реАрдХреНрд╖рдг, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЗрддрдирд╛ рд╕рд┐рдВрдереЗрдЯрд┐рдХ рдирд╣реАрдВ рд╣реИред рдЖрд░рдмреАрдПрдл рдкреНрд░рдХреНрд╖реЗрдк, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрдореНрдкреНрдпреВрдЯреЗрд╢рдирд▓ рдЧрдгрд┐рдд рдХреЗ рдХрдИ рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рджреВрд░реА рдХреЗ рдХрд╛рд░реНрдп рдХреЗ рд░реВрдк рдореЗрдВ рдРрд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреА рдЧрдгрдирд╛ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред
рд╕рдорд╛рдВрддрд░ рд╡рд┐рдзрд┐ред

рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдореЗрдВ, рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреА рдкреНрд░рддреНрдпреЗрдХ рдкрдВрдХреНрддрд┐ рдХреА рдЧрдгрдирд╛ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреА рдкреНрд░рддреНрдпреЗрдХ рдХреБрдЫ рдкрдВрдХреНрддрд┐рдпреЛрдВ рд╕реЗ, рд╣рдо рд╕реНрд╡рддрдВрддреНрд░ рдиреМрдХрд░рд┐рдпрд╛рдВ рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдиреМрдХрд░реА рдХреА рдХрддрд╛рд░ рдореЗрдВ рд░рдЦрддреЗ рд╣реИрдВ (рдЪрд┐рддреНрд░ 1 рджреЗрдЦреЗрдВ)ред рдЪрд▓реЛ рдХреБрдЫ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдБ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрддрд╛рд░ рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдЕрдЧрд▓рд╛ рдХрд╛рд░реНрдп рдХрд░реЗрдЧреА рдЬрдм рддрдХ рдХрд┐ рдпрд╣ рдХреЛрдб "рдЕрдВрдд" рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд┐рд╢реЗрд╖ рдХрд╛рд░реНрдп рдХрд╛ рд╕рд╛рдордирд╛ рди рдХрд░реЗред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЕрдкрдирд╛ рдХрд╛рдо рд╕рдорд╛рдкреНрдд рдХрд░ рджреЗрддреА рд╣реИред
рдкрд╛рдпрдерди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиред
рдкрд╛рдпрдерди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ, рд╣рдорд╛рд░реЗ рджреЛ рдореБрдЦреНрдп рддрд░реАрдХреЗ рд╣реЛрдВрдЧреЗ: mpCalcDistance (рдиреЛрдбреНрд╕) рдФрд░
mpCalcDistance_Worker (рдиреЛрдбреНрд╕, рдХрддрд╛рд░, arrD)ред MpCalcDistance (рдиреЛрдб) рд╡рд┐рдзрд┐ рдиреЛрдбреНрд╕ рдХреА рдПрдХ рд╕реВрдЪреА рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдПрдХ рд╕рд╛рдЭрд╛ рдореЗрдореЛрд░реА рдХреНрд╖реЗрддреНрд░ рдмрдирд╛рддрд╛ рд╣реИ, рдПрдХ рдиреМрдХрд░реА рдХрддрд╛рд░ рддреИрдпрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдВ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИред MpCalcDistance_Worker рд╡рд┐рдзрд┐ (рдиреЛрдбреНрд╕, рдХрддрд╛рд░, arrD) рдПрдХ рдХрдореНрдкреНрдпреВрдЯреЗрд╢рдирд▓ рд╡рд┐рдзрд┐ рд╣реИ рдЬреЛ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдзрд╛рдЧреЗ рдореЗрдВ рдЪрд▓рддреА рд╣реИред рдпрд╣ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдиреЛрдбреНрд╕, рдПрдХ рдиреМрдХрд░реА рдХрддрд╛рд░ рдФрд░ рдПрдХ рд╕рд╛рдЭрд╛ рдореЗрдореЛрд░реА рдХреНрд╖реЗрддреНрд░ рдХреА рд╕реВрдЪреА рд▓реЗрддрд╛ рд╣реИред рдЗрди рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред
MpCalcDistance (рдиреЛрдбреНрд╕) рд╡рд┐рдзрд┐
рдПрдХ рд╕рд╛рдЭрд╛ рдореЗрдореЛрд░реА рдХреНрд╖реЗрддреНрд░ рдмрдирд╛рдПрдБ:
nP = nodes.shape[0] nQ = nodes.shape[0] arrD = mp.RawArray(ctypes.c_double, nP * nQ)
рдПрдХ рдиреМрдХрд░реА рдХрддрд╛рд░ рдмрдирд╛рдПрдБред рдкреНрд░рддреНрдпреЗрдХ рдХрд╛рд░реНрдп рдПрдХ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреА рд▓рд╛рдЗрдиреЛрдВ рдХреА рдПрдХ рд╕реАрдорд╛ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИред рд╡рд┐рд╢реЗрд╖ рдореВрд▓реНрдп рдХреЛрдИ рднреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рд╕рдВрдХреЗрдд рдирд╣реАрдВ рд╣реИ:
nCPU = 2 nJobs = nCPU * 36 q = nP / nJobs r = nP % nJobs jobs = [] firstRow = 0 for i in range(nJobs): rowsInJob = q if (r > 0): rowsInJob += 1 r -= 1 jobs.append((firstRow, rowsInJob)) firstRow += rowsInJob queue = mp.JoinableQueue() for job in jobs: queue.put(job) for i in range(nCPU): queue.put(None)
рд╣рдо рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рддрдм рддрдХ рдЗрдВрддрдЬрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ рдЬрдм рддрдХ рдХрд┐ рдиреМрдХрд░реА рдХреА рдХрддрд╛рд░ рд╕рдорд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддреА:
workers = [] for i in range(nCPU): worker = mp.Process(target = mpCalcDistance_Worker, args = (nodes, queue, arrD)) workers.append(worker) worker.start() queue.join()
рд╕рд╛рдЭрд╛ рдореЗрдореЛрд░реА рдХреЗ рдХреНрд╖реЗрддреНрд░ рд╕реЗ, рд╣рдо рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдмрдирд╛рддреЗ рд╣реИрдВ:
D = np.reshape(np.frombuffer(arrD), (nP, nQ)) return D
MpCalcDistance_Worker рд╡рд┐рдзрд┐ (рдиреЛрдбреНрд╕, рдХрддрд╛рд░, arrD)
рд╣рдо рд╕рд╛рдЭрд╛ рдореЗрдореЛрд░реА рдХреНрд╖реЗрддреНрд░ рдХреЛ рдПрдХ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдореЗрдВ рд▓рдкреЗрдЯрддреЗ рд╣реИрдВ:
nP = nodes.shape[0] nQ = nodes.shape[0] D = np.reshape(np.frombuffer(arrD), (nP, nQ))
рдЬрдм рддрдХ рдиреМрдХрд░реА рдХреА рдХрддрд╛рд░ рдЦрддреНрдо рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддреА, рддрдм рддрдХ рдХрддрд╛рд░ рд╕реЗ рдЕрдЧрд▓реА рдиреМрдХрд░реА рд▓реЗрдВ рдФрд░ рдЧрдгрдирд╛ рдХрд░реЗрдВ:
while True: job = queue.get() if job == None: break start = job[0] stop = job[0] + job[1]
рдкрд░рд┐рдгрд╛рдо
рд░рдирдЯрд╛рдЗрдо рд╡рд╛рддрд╛рд╡рд░рдг: рджреЛрд╣рд░реЗ рдХреЛрд░ рдкреНрд░реЛрд╕реЗрд╕рд░, рдЙрдмрдВрдЯреВ 12.04, 64 рдмрд┐рдЯред


рдкрд╣рд▓реА рддрд╕реНрд╡реАрд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдПрди рдХреЗ рд▓рд┐рдП рдПрдХрд▓-рдереНрд░реЗрдбреЗрдб рдФрд░ рджреЛ-рдереНрд░реЗрдбреЗрдб рдЧрдгрдирд╛ рдХрд╛ рд╕рдордп рджрд┐рдЦрд╛рддреА рд╣реИред рджреВрд╕рд░реА рддрд╕реНрд╡реАрд░ рдПрдХрд▓-рдереНрд░реЗрдбреЗрдб рдЧрдгрдирд╛ рдХреЗ рд╕рдордп рдХреЗ рдЕрдиреБрдкрд╛рдд рдХреЛ рджреЛ-рдереНрд░реЗрдбреЗрдб рд╕реЗ рджрд░реНрд╢рд╛рддреА рд╣реИред рдпрд╣ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдПрди = 500 рд╕реЗ рд╢реБрд░реВ рд╣реЛрдХрд░ рд╣рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЧрдгрдирд╛ рдХрд╛ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рддреНрд╡рд░рдг рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред
рдПрди = 2000 рдХреЗ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдПрдХ рдмрд╣реБрдд рд╣реА рджрд┐рд▓рдЪрд╕реНрдк рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред рдПрдХрд▓-рдереНрд░реЗрдбреЗрдб рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, рд╣рдореЗрдВ рдЧрдгрдирд╛ рд╕рдордп рдореЗрдВ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рдХреВрдж рдорд┐рд▓рддрд╛ рд╣реИ, рдФрд░ рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рдЧрдгрдирд╛ рдореЗрдВ, рддреНрд╡рд░рдг рдЧреБрдгрд╛рдВрдХ 2 рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдореИрдВ рдХреИрд╢ рдкреНрд░рднрд╛рд╡ рджреНрд╡рд╛рд░рд╛ рд╕рдордЭрд╛рддрд╛ рд╣реВрдВред рдПрдХ рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, рдкреНрд░рддреНрдпреЗрдХ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХреИрд╢ рд╣реИред рд▓реЗрдХрд┐рди рд╕рд┐рдВрдЧрд▓-рдереНрд░реЗрдбреЗрдб рдореЗрдВ рдирд╣реАрдВ рд╣реИред
рддреЛ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдФрд░ рд╕рд╛рдЭрд╛ рд╕реНрдореГрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдмрд╕ рдЖрдкрдХреЛ рдЬреАрдЖрдИрдПрд▓ рдХреА рд╕реАрдорд╛рдУрдВ рдХреЛ рджрд░рдХрд┐рдирд╛рд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдкреВрд░реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдкреВрд░рд╛ рдХреЛрдб:
""" Python multiprocessing with shared memory example. This example demonstrate workaround for the GIL problem. Workaround uses processes instead of threads and RawArray allocated from shared memory. See also: [1] http://docs.python.org/2/library/multiprocessing.html [2] http://folk.uio.no/sturlamo/python/multiprocessing-tutorial.pdf [3] http://www.bryceboe.com/2011/01/28/the-python-multiprocessing-queue-and-large-objects/ """ import time import ctypes import multiprocessing as mp import numpy as np import matplotlib.pyplot as plt def generateNodes(N): """ Generate random 3D nodes """ return np.random.rand(N, 3) def spCalcDistance(nodes): """ Single process calculation of the distance function. """ p = nodes q = nodes.T