亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

proses

Berbilang benang dalam Python sebenarnya bukan berbilang benang sebenar Jika anda ingin menggunakan sepenuhnya sumber CPU berbilang teras, anda perlu menggunakan berbilang proses dalam kebanyakan kes dalam Python. Python menyediakan pakej berbilang pemprosesan yang sangat mudah digunakan Anda hanya perlu menentukan fungsi dan Python akan melakukan segala-galanya. Dengan bantuan pakej ini, penukaran daripada proses tunggal kepada pelaksanaan serentak boleh dicapai dengan mudah. Multiprocessing menyokong sub-proses, komunikasi dan perkongsian data, melaksanakan bentuk penyegerakan yang berbeza dan menyediakan komponen seperti Proses, Baris Gilir, Paip dan Kunci.

1. Proses Kelas

Kelas yang mencipta proses: Proses([kumpulan [, sasaran [, nama [, args [, kwargs]]]]])

sasaran mewakili objek panggilan

args mewakili objek panggilan Tuple parameter kedudukan

kwargs mewakili kamus objek panggilan

nama ialah alias

kumpulan pada dasarnya tidak digunakan

Mari kita lihat contoh mencipta fungsi dan menggunakannya sebagai pelbagai proses:

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
import multiprocessing
import time
def worker(interval, name):
    print(name + '【start】')
    time.sleep(interval)
    print(name + '【end】')
if __name__ == "__main__":
    p1 = multiprocessing.Process(target=worker, args=(2, '兩點(diǎn)水1'))
    p2 = multiprocessing.Process(target=worker, args=(3, '兩點(diǎn)水2'))
    p3 = multiprocessing.Process(target=worker, args=(4, '兩點(diǎn)水3'))
    p1.start()
    p2.start()
    p3.start()
    print("The number of CPU is:" + str(multiprocessing.cpu_count()))
    for p in multiprocessing.active_children():
        print("child   p.name:" + p.name + "\tp.id" + str(p.pid))
    print("END!!!!!!!!!!!!!!!!!")

Hasil keluaran:

Hasil keluaran berbilang proses

2. Buat proses ke dalam kelas

Sudah tentu kita juga boleh mencipta proses ke dalam kelas, seperti dalam contoh di bawah, apabila proses p panggilan bermula() , kaedah run() dipanggil secara automatik.

# -*- coding: UTF-8 -*-
import multiprocessing
import time
class ClockProcess(multiprocessing.Process):
    def __init__(self, interval):
        multiprocessing.Process.__init__(self)
        self.interval = interval
    def run(self):
        n = 5
        while n > 0:
            print("當(dāng)前時(shí)間: {0}".format(time.ctime()))
            time.sleep(self.interval)
            n -= 1
if __name__ == '__main__':
    p = ClockProcess(3)
    p.start()

Hasil keluaran adalah seperti berikut:

Buat kelas proses

3 Atribut Daemon

Jika anda ingin tahu untuk kegunaan atribut daemon, lihat dua contoh berikut, satu dengan atribut daemon ditambah dan satu tanpa, bandingkan hasil output:

Contoh tanpa menambah atribut deamon:

# -*- coding: UTF-8 -*-
import multiprocessing
import time
def worker(interval):
    print('工作開始時(shí)間:{0}'.format(time.ctime()))
    time.sleep(interval)
    print('工作結(jié)果時(shí)間:{0}'.format(time.ctime()))
if __name__ == '__main__':
    p = multiprocessing.Process(target=worker, args=(3,))
    p.start()
    print('【EMD】')

Hasil output:

【EMD】
工作開始時(shí)間:Mon Oct  9 17:47:06 2017
工作結(jié)果時(shí)間:Mon Oct  9 17:47:09 2017

Dalam contoh di atas, proses p menambah atribut daemon:

# -*- coding: UTF-8 -*-
import multiprocessing
import time
def worker(interval):
    print('工作開始時(shí)間:{0}'.format(time.ctime()))
    time.sleep(interval)
    print('工作結(jié)果時(shí)間:{0}'.format(time.ctime()))
if __name__ == '__main__':
    p = multiprocessing.Process(target=worker, args=(3,))
    p.daemon = True
    p.start()
    print('【EMD】')

Hasil output:

boleh dilihat mengikut hasil output, jika dalam proses anak Atribut daemon ditambahkan ke , jadi apabila proses utama tamat, proses anak juga akan berakhir. Jadi tiada maklumat tentang proses kanak-kanak dicetak. .

Kemudian kita boleh menggunakan kaedah gabungan Fungsi utama kaedah gabungan adalah untuk menyekat proses semasa sehingga proses yang memanggil kaedah gabungan selesai melaksanakan, dan kemudian terus melaksanakan proses semasa.

Jadi lihat contoh menambah kaedah gabungan:

【EMD】

Hasil output:

import multiprocessing
import time
def worker(interval):
    print('工作開始時(shí)間:{0}'.format(time.ctime()))
    time.sleep(interval)
    print('工作結(jié)果時(shí)間:{0}'.format(time.ctime()))
if __name__ == '__main__':
    p = multiprocessing.Process(target=worker, args=(3,))
    p.daemon = True
    p.start()
    p.join()
    print('【EMD】')

5, Pool

Jika banyak proses anak diperlukan, adakah kita perlu menciptanya satu persatu?

Sudah tentu tidak, kita boleh menggunakan kaedah kumpulan proses untuk mencipta proses anak dalam kelompok.
Contohnya adalah seperti berikut:

工作開始時(shí)間:Tue Oct 10 11:30:08 2017
工作結(jié)果時(shí)間:Tue Oct 10 11:30:11 2017
【EMD】

Hasil output adalah seperti berikut:

# -*- coding: UTF-8 -*-
from multiprocessing import Pool
import os, time, random
def long_time_task(name):
    print('進(jìn)程的名稱:{0} ;進(jìn)程的PID: {1} '.format(name, os.getpid()))
    start = time.time()
    time.sleep(random.random() * 3)
    end = time.time()
    print('進(jìn)程 {0} 運(yùn)行了 {1} 秒'.format(name, (end - start)))
if __name__ == '__main__':
    print('主進(jìn)程的 PID:{0}'.format(os.getpid()))
    p = Pool(4)
    for i in range(6):
        p.apply_async(long_time_task, args=(i,))
    p.close()
    # 等待所有子進(jìn)程結(jié)束后在關(guān)閉主進(jìn)程
    p.join()
    print('【End】')

Terdapat satu perkara yang perlu diperhatikan di sini: memanggil kaedah join() objek Pool akan menunggu semua proses kanak-kanak menyelesaikan pelaksanaan, dan close() mesti dipanggil sebelum memanggil join().

Sila beri perhatian kepada hasil output proses Anak 0, 1, 2, dan 3 dilaksanakan serta-merta, manakala proses anak 4 perlu menunggu selesainya proses anak sebelum melaksanakan Ini kerana saiz lalai Pool pada komputer saya ialah 4, oleh itu, maksimum 4 proses boleh dilaksanakan secara serentak. Ini adalah pengehadan reka bentuk yang disengajakan bagi Pool, bukan pengehadan sistem pengendalian. Jika anda menukarnya kepada:

主進(jìn)程的 PID:7256
進(jìn)程的名稱:0 ;進(jìn)程的PID: 1492
進(jìn)程的名稱:1 ;進(jìn)程的PID: 12232
進(jìn)程的名稱:2 ;進(jìn)程的PID: 4332
進(jìn)程的名稱:3 ;進(jìn)程的PID: 11604
進(jìn)程 2 運(yùn)行了 0.6500370502471924 秒
進(jìn)程的名稱:4 ;進(jìn)程的PID: 4332
進(jìn)程 1 運(yùn)行了 1.0830621719360352 秒
進(jìn)程的名稱:5 ;進(jìn)程的PID: 12232
進(jìn)程 5 運(yùn)行了 0.029001712799072266 秒
進(jìn)程 4 運(yùn)行了 0.9720554351806641 秒
進(jìn)程 0 運(yùn)行了 2.3181326389312744 秒
進(jìn)程 3 運(yùn)行了 2.5331451892852783 秒
【End】

, anda boleh menjalankan 5 proses pada masa yang sama.

6. Komunikasi antara proses

Proses pastinya perlu berkomunikasi. Modul pemproses berbilang Python membungkus mekanisme asas dan menyediakan pelbagai kaedah seperti Baris Gilir dan Paip untuk bertukar data.

Ambil Queue sebagai contoh, buat dua proses anak dalam proses induk, satu menulis data ke Queue, dan satu lagi membaca data dari Queue:

p = Pool(5)

Hasil output ialah:

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
from multiprocessing import Process, Queue
import os, time, random
def write(q):
    # 寫數(shù)據(jù)進(jìn)程
    print('寫進(jìn)程的PID:{0}'.format(os.getpid()))
    for value in ['兩點(diǎn)水', '三點(diǎn)水', '四點(diǎn)水']:
        print('寫進(jìn) Queue 的值為:{0}'.format(value))
        q.put(value)
        time.sleep(random.random())
def read(q):
    # 讀取數(shù)據(jù)進(jìn)程
    print('讀進(jìn)程的PID:{0}'.format(os.getpid()))
    while True:
        value = q.get(True)
        print('從 Queue 讀取的值為:{0}'.format(value))
if __name__ == '__main__':
    # 父進(jìn)程創(chuàng)建 Queue,并傳給各個(gè)子進(jìn)程
    q = Queue()
    pw = Process(target=write, args=(q,))
    pr = Process(target=read, args=(q,))
    # 啟動(dòng)子進(jìn)程 pw
    pw.start()
    # 啟動(dòng)子進(jìn)程pr
    pr.start()
    # 等待pw結(jié)束:
    pw.join()
    # pr 進(jìn)程里是死循環(huán),無法等待其結(jié)束,只能強(qiáng)行終止
    pr.terminate()
Meneruskan pembelajaran