Di python 3, Anda sekarang dapat membuka file dengan aman menggunakan klausa with seperti ini:

with open("stuff.txt") as f:
    data = f.read()

Menggunakan metode ini, saya tidak perlu khawatir tentang menutup koneksi

Saya bertanya-tanya apakah saya bisa melakukan hal yang sama untuk multiprocessing. Misalnya, kode saya saat ini terlihat seperti:

pool = multiprocessing.Pool(processes=multiprocessing.cpu_count())
pool.starmap(function,list)
pool.close()
pool.join()

Apakah ada cara saya bisa menggunakan klausa with untuk menyederhanakan ini?

17
idude 16 Agustus 2017, 19:17

2 jawaban

Jawaban Terbaik
with multiprocessing.Pool( ... ) as pool:
    pool.starmap( ... )

https://docs.python.org/3/library/multiprocessing.html#multiprocessing.pool.Pool

Baru di versi 3.3: Objek kumpulan sekarang mendukung protokol manajemen konteks – lihat Jenis Manajer Konteks. enter() mengembalikan objek kumpulan, dan keluar() memanggil penghentian().

Anda dapat melihat contoh di bagian bawah Pool.

14
noxdafox 17 Agustus 2017, 11:55

Meskipun lebih dari yang diminta OP, jika Anda menginginkan sesuatu yang berfungsi untuk Python 2 dan Python 3, Anda dapat menggunakan:

# For python 2/3 compatibility, define pool context manager
# to support the 'with' statement in Python 2
if sys.version_info[0] == 2:
    from contextlib import contextmanager
    @contextmanager
    def multiprocessing_context(*args, **kwargs):
        pool = multiprocessing.Pool(*args, **kwargs)
        yield pool
        pool.terminate()
else:
    multiprocessing_context = multiprocessing.Pool

Setelah itu, Anda dapat menggunakan multiprocessing dengan cara Python 3 biasa, terlepas dari versi Python yang Anda gunakan. Sebagai contoh:

def _function_to_run_for_each(x):
       return x.lower()
with multiprocessing_context(processes=3) as pool:
    results = pool.map(_function_to_run_for_each, ['Bob', 'Sue', 'Tim'])    print(results)

Akan bekerja di Python 2 atau Python 3.

1
cgnorthcutt 16 Februari 2019, 04:58