Paralerní zpracování metody ze třídy – Python – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Paralerní zpracování metody ze třídy – Python – Fórum – Programujte.comParalerní zpracování metody ze třídy – Python – Fórum – Programujte.com

 

Jouker
~ Anonymní uživatel
22 příspěvků
15. 2. 2021   #1
-
0
-

Dobrý den,

 řeším paralelní spouštění funkcí. Napadlo mě to udělat přes třídu, ale self.value mi nereaguje na paralerně zpracovanou metodu. Jde to takto udělat?

import multiprocessing as mp

class Dog():
  def __init__(self, name):
    self.name = name
    self.value = 0

  def start(self):
    self.value = 3 + 2


if __name__ == '__main__':
  dog = Dog('Rex')
  print('dog.value', dog.value)

  procedure = dog.start
  pool = mp.Pool(mp.cpu_count())
  pool.apply_async(func=[procedure])

  pool.close()
  pool.join()

  print('dog.value', dog.value)

Děkuji za informace.

Nahlásit jako SPAM
IP: 217.28.83.–
gna
~ Anonymní uživatel
1555 příspěvků
15. 2. 2021   #2
-
0
-

Multiprocessing používá izolované procesy, které nesdílejí data. Takže ten "worker" zdědí data hlavního procesu, ale změny se nikam jinam nepromítnou. (Existují explicitně sdílené proměnné jako mp.Value, ale to už je zase jinde.)

Je to určené na volání funkcí - pošleš parametry, dostaneš návratovou hodnotu. Nekomplikuj si život :-)

Nahlásit jako SPAM
IP: 213.211.51.–
gna
~ Anonymní uživatel
1555 příspěvků
15. 2. 2021   #3
-
0
-

Jo, a func jako list se mi nějak nezdá. Jseš si jistý, že se ti to vůbec spouští?

func=[procedure]
Nahlásit jako SPAM
IP: 213.211.51.–
Jouker
~ Anonymní uživatel
22 příspěvků
15. 2. 2021   #4
-
0
-

#3 gna
Ano,

 funguje to správně. Jen to nemění hodnotu v třídě.

Nahlásit jako SPAM
IP: 217.28.83.–
gna
~ Anonymní uživatel
1555 příspěvků
15. 2. 2021   #5
-
0
-

Mění, ale v jiném objektu v jiném procesu. Teda ani to ne, protože se to vůbec nespustí.

Nahlásit jako SPAM
IP: 213.211.51.–
Jouker
~ Anonymní uživatel
22 příspěvků
15. 2. 2021   #6
-
0
-

#5 gna
Pravda, nesmí to být v listu (měl jsem to tam jako pozůstatek z loopu). 
pool.apply_async(func=procedure) je správně.

Opravdu není možnost, jak to přes třídu udělat?  Moc se mi nelíbí to ukládat přes 
callback do jednoho listu.

Nahlásit jako SPAM
IP: 217.28.83.–
gna
~ Anonymní uživatel
1555 příspěvků
15. 2. 2021   #7
-
0
-

Určitě by to šlo, ale na co?

import multiprocessing as mp


def dostuff():
  return 5


if __name__ == '__main__':
  pool = mp.Pool(mp.cpu_count())
  res = pool.apply_async(dostuff)

  pool.close()
  pool.join()

  print('value', res.get())
Nahlásit jako SPAM
IP: 213.211.51.–
Jouker
~ Anonymní uživatel
22 příspěvků
15. 2. 2021   #8
-
0
-

#7 gna
Děkuji, takhle to alespoň vypadá líp, než např: 
pool.apply_async(func=fcn, args=args, callback=add_result).
 

Nahlásit jako SPAM
IP: 217.28.83.–
Jouker
~ Anonymní uživatel
22 příspěvků
19. 2. 2021   #9
-
0
-

#7 gna
Dobrý den,

 chtěl jsem se ještě zeptat ohledně paralelního zpracování v cyklu. Když to spustím v PyCharmu, vše funguje jak má. Pokud ale udělám build a spustím exe, pak se začnou procesy množit a musím program zabít. Nevíte, kde by mohl být problém?

import time
import multiprocessing

def process1():
  print('process1')
  for i in range(2):
    time.sleep(1)
  return 5

def process2():
  print('process2')
  for i in range(3):
    time.sleep(1)
  return 6

if __name__ == '__main__':
  try:
    for epoch in range(3):
      pool = multiprocessing.Pool(multiprocessing.cpu_count())

      res1 = pool.apply_async(process1)
      res2 = pool.apply_async(process2)

      pool.close()
      pool.join()

      print('results:', res1.get(), res2.get())
      print('---')
      time.sleep(5)

    input('exit')
  except Exception as err:
    pool.close()
    pool.join()
    print('err', err)
    input('exit exception')

Děkuji.

Nahlásit jako SPAM
IP: 217.28.83.–
gna
~ Anonymní uživatel
1555 příspěvků
20. 2. 2021   #10
-
0
-

Úplně vnitřnosti neznám, ale asi je možné, že se ty procesy uvolňují až se zpožděním. Když to dáš do with, tak by se měly kompletně ukončit a uvolnit hned (po vyskočení z toho bloku with).

if __name__ == '__main__':
  try:
    for epoch in range(3):
      with multiprocessing.Pool(multiprocessing.cpu_count()) as pool:
        res1 = pool.apply_async(process1)
        res2 = pool.apply_async(process2)

        pool.close()
        pool.join()

        print('results:', res1.get(), res2.get())
        print('---')
        time.sleep(5)
    input('exit')
  except Exception as err:
    print('err', err)
    input('exit exception')
Nahlásit jako SPAM
IP: 213.211.51.–
gna
~ Anonymní uživatel
1555 příspěvků
20. 2. 2021   #11
-
0
-

A pointa je v tom, že opuštění toho bloku zavolá pool.terminate(), což můžeš dělat i bez toho, ale s with na to nemusíš myslet.

Nahlásit jako SPAM
IP: 213.211.51.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 7 hostů

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032021 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý