Baru-baru ini, saya telah bereksperimen dengan modul multiprosesor. Saya menulis skrip ini untuk mengujinya:

import multiprocessing
from time import sleep
import datetime

def b(m):
   print(m)

def int_val(a):
   b(a)

def char_val(a):
   sleep(15)
   b(a)

list_val = [1,2,'c',6,10,1,'e',11,78,'a', 'b']

if __name__ == '__main__':
   p = multiprocessing.Pool(4)
   for index, val in enumerate(list_val):
      if isinstance(val, str):
         p.map(char_val, [val])
         print(datetime.datetime.now())
      else:
         p.map(int_val, [val])
         print(datetime.datetime.now())

Outputnya terlihat seperti ini:

1
2020-03-29 01:45:37.099114
2
2020-03-29 01:45:37.099114
c
2020-03-29 01:45:52.114733
6
2020-03-29 01:45:52.114733
10
2020-03-29 01:45:52.114733
1
2020-03-29 01:45:52.114733
e
2020-03-29 01:46:07.115963
11
2020-03-29 01:46:07.115963
78
2020-03-29 01:46:07.115963
a
2020-03-29 01:46:22.117232
b
2020-03-29 01:46:37.118046

Jika kita melihat outputnya, program tersebut belum benar-benar mencapai multi-processing yang saya cari.

Saya berharap bahwa sementara program menunggu selama 15 detik untuk elemen 'c', elemen lain akan diproses dan hampir semua karakter akan dicetak pada waktu yang sama.

Ini mungkin pertanyaan konyol, tapi saya benar-benar tersesat!

Bantuan apa pun akan sangat dihargai!

2
Sankar 29 Maret 2020, 08:54

1 menjawab

Jawaban Terbaik

Anda memanggil p.map secara iteratif untuk setiap elemen daftar, jadi pada dasarnya Anda membuat proses baru untuk setiap elemen. Karena p.map adalah panggilan pemblokiran, panggilan tersebut sebenarnya menunggu eksekusi char_val('c') sebelum melanjutkan.

Jika Anda memberikan seluruh list_val ke p.map(), Anda akan mendapatkan urutan eksekusi yang diharapkan

import multiprocessing
from time import sleep
import datetime

def b(m):
   print(m)

def int_val(a):
   b(a)

def char_val(a):
   sleep(15)
   b(a)

def f(val):
    if isinstance(val, str):
        char_val(val)
        print(datetime.datetime.now())
    else:
        int_val(val)
        print(datetime.datetime.now())

list_val = [1,2,'c',6,10,1,'e',11,78,'a', 'b']

if __name__ == '__main__':
   p = multiprocessing.Pool(4)
   p.map(f, list_val)
   # for index, val in enumerate(list_val):
      # if isinstance(val, str):
         # p.map(char_val, [val])
         # print(datetime.datetime.now())
      # else:
         # p.map(int_val, [val])
         # print(datetime.datetime.now())

Keluaran:

1
2020-03-29 11:38:15.373607
2
2020-03-29 11:38:15.373764
6
2020-03-29 11:38:15.374008
10
1
2020-03-29 11:38:15.374117
2020-03-29 11:38:15.374108
11
2020-03-29 11:38:15.374233
78
2020-03-29 11:38:15.374438
c
a
2020-03-29 11:38:30.388652
2020-03-29 11:38:30.388761
e
b
2020-03-29 11:38:30.389465
2020-03-29 11:38:30.389566
1
Bohrium272 29 Maret 2020, 06:12