Wpis z mikrobloga

Zastanawiam się, czy dobrze wywołuje procesy i oczekuje na ich zakończenie w #python
Ogólnie teraz przerabiam pewien program do aktualizacji danych z zewnętrznych hurtownii - żeby listy towarów przerabiało na wymagany format i zapisywało do pliku (każda hurtownia do swojego pliku).

Kod wygląda tak:

def func_hurt_n(): #przykladowa funkcja dla danej hurtownii
....ware = HurtN() #klasa hurtownii ktora dziedziczy po abstrakcyjnej i robi wszystko co trzeba
....ware_id = 1 #id hurtownii (do aktualizacji pliku)

....wareutils.updateWare(ware, ware_id)

if __name__ == '__main__':
....#lista hurtownii (funkcje do wywołania w nowym procesie)
....WARES = [
........func_hurt_1,
........func_hurt_2,
........func_hurt_3,
........func_hurt_x,
........func_hurt_n
....]

....# Aktualizuj dane z hurtownii
....proc_list = list() # procesy
....for ware_func in WARES: # uruchom nowe procesy dla każdej hurtownii
........p = multiprocessing.Process(target=ware_func)
........p.start()
........proc_list.append(p)

....for p in proc_list: # oczekuj na zakończenie procesów
........p.join()

EDIT: ach ten wypok, musiałem dać kropki bo usuwa pierwsze spacje i tabulatory w kodzie ( ͡° ͜ʖ ͡°)

Tak wiem, mogę wywołać po prostu funkcje wareutils.updateWare z parametrami podczas tworzenia procesu - to jest pisane na szybko ( ͡° ͜ʖ ͡°) a raczej przerabiane na szybko do multiprocessingu - wcześniej wywoływane to było sekwencyjnie, a funkcje zostały - było w nich więcej danych ale wszystko co trzeba przeniosłem po prostu do odpowiednich klas.

Bardziej chodzi mi o oczekiwanie na zakończenie procesu - metoda join() w pętli for. Czy takie oczekiwanie w pętli jest ok? Sprawdzałem, to procesy które zakończą się pierwsze (i są pierwsze na liście) są usuwane, a jedna hurtownia która wykonuje się dość długo powoduje, że inne procesy uruchomione po niej przechodzą w stan 'zombie' w systemie linux - na czas dopóki ta hurtownia która wykonuje się najdłużej nie zakończy swojego procesu.

Więc czy dobrze robię, że oczekuje w ten sposób na procesy? Czy może skorzystać z innego rozwiązania niż pętla for? Ogólnie zajmuje to dla każdej hurtownii trochę czasu, bo najpierw musi pobrać z niej plik XML, potem go przetworzyć, zapisać w danym formacie i wysłać na serwer - dlatego zależy mi na multiprocessingu

Akurat multiprocessing, bo czytałem, że multithreading w pythonie nie pozwala na wykonywanie równocześnie wielu wątków, ale ponoć chyba operacje I/O które najdłużej tutaj zajmują powinny się wykonywać mimo wszystko równolegle?

#programowanie #python #programista15k #algorytmy
  • 5
nie lepiej Ci użyć CELERY zamiast rzeźbić?


@Arogancky: nie znam tego. Ale uczyc się nowej biblioteki do takiej prostej rzeczy to moim zdaniem strzelanie z armaty do wróbla

https://docs.python.org/3/library/concurrent.futures.html


@Arogancky: ooo to już ciekasze - np ThreadPoolExecutor albo ProcessPoolExecutor

No chyba że faktycznie chcesz używać procesów, ale imho bez sensu


@Arogancky: wątki czy procesy - obojętne. Zależy mi na tym, żeby było to wykonane współbieżnie. Głównie przez długie operacje
@Arogancky: dzięki wielkie. W tym wypadku który opisałem, to threadpoolexecutor będzie lepszy niż processpoolexecutor?

Tak przy okazji, jeszcze doczytałem, że w przypadku procesów można ustawić metodę 'spawn', 'fork'(domyślna na linuxie) i 'forkserver' - której najlepiej używać w razie czego? fork czy spawn?
@lukasj: jak kiedyś pisałem coś pod Linuxa i miało to związek z procesami to używałem fork. Chyba dlatego że to były procesy potomne od parenta, nie pamiętam. Spawn powinno się lepiej sprawdzić. Ale pewnie warto poczytać docsy i zrobić 2 POCe i porównać działanie ;)