Próbuję użyć wieloprocesowego obiektu Pool. Chciałbym, aby każdy proces otwierał połączenie z bazą danych po uruchomieniu, a następnie używał tego połączenia do przetwarzania danych, które są przekazywane. (Zamiast otwierania i zamykania połączenia dla każdego bitu danych.) Wygląda na to, że inicjator jest dla, ale nie mogę owijać głowy, jak komunikować się pracownik i inicjator. Więc mam coś takiego:jak użyć inicjalizatora do skonfigurowania puli wieloprocesowej?
def get_cursor():
return psycopg2.connect(...).cursor()
def process_data(data):
# here I'd like to have the cursor so that I can do things with the data
if __name__ == "__main__":
pool = Pool(initializer=get_cursor, initargs=())
pool.map(process_data, get_some_data_iterator())
jak mogę (lub mam) dostać kursor z powrotem get_cursor() do process_data()?
to powinna być zaakceptowana odpowiedź. – thias
@torek Czy powinienem wywołać set_global_cursor w init_worker? –
@TheUnfunCat: nie wiedząc, co to jest 'init_worker' (widzę jedną w twojej odpowiedzi, ale nie ma jej w oryginalnym pytaniu) Nie mogę powiedzieć na pewno. Ogólną ideą jest zezwolenie na "wieloprocesowość".Pool', aby utworzyć pulę procesów i aby każdy z tych procesów utworzył (własną prywatną kopię) połączenia z bazą danych. Jeśli chcesz, aby tak się stało, gdy proces puli zostanie uruchomiony, użyjesz funkcji inicjalizatora. Jeśli chcesz, aby stało się to później, możesz zrobić to później. Tak czy inaczej potrzebujesz stałej zmiennej, jak w przypadku 'function.cursor' w twojej metodzie lub zwykłego' global'. – torek