国产睡熟迷奷白丝护士系列精品,中文色字幕网站,免费h网站在线观看的,亚洲开心激情在线

      <sup id="hb9fh"></sup>
          1. 千鋒教育-做有情懷、有良心、有品質(zhì)的職業(yè)教育機(jī)構(gòu)

            手機(jī)站
            千鋒教育

            千鋒學(xué)習(xí)站 | 隨時(shí)隨地免費(fèi)學(xué)

            千鋒教育

            掃一掃進(jìn)入千鋒手機(jī)站

            領(lǐng)取全套視頻
            千鋒教育

            關(guān)注千鋒學(xué)習(xí)站小程序
            隨時(shí)隨地免費(fèi)學(xué)習(xí)課程

            當(dāng)前位置:首頁  >  技術(shù)干貨  > Python編程中,如何使用多進(jìn)程完成多任務(wù)進(jìn)程有哪些注意點(diǎn)?

            Python編程中,如何使用多進(jìn)程完成多任務(wù)進(jìn)程有哪些注意點(diǎn)?

            來源:千鋒教育
            發(fā)布人:xqq
            時(shí)間: 2023-10-13 06:53:34 1697151214

            一、Python編程中,使用多進(jìn)程完成多任務(wù)的方法

            Python提供了multiprocessing模塊,可以用于在單個(gè)計(jì)算機(jī)上創(chuàng)建多個(gè)進(jìn)程,從而實(shí)現(xiàn)多任務(wù)處理。下面是一個(gè)簡單的例子,展示了如何使用multiprocessing模塊創(chuàng)建多進(jìn)程來完成多任務(wù)。

            代碼:

            import multiprocessingimport time# 跳舞任務(wù)def dance():    for i in range(5):        print("跳舞中...")        time.sleep(0.2)# 唱歌任務(wù)def sing():    for i in range(5):        print("唱歌中...")        time.sleep(0.2)if __name__ == '__main__':    # 創(chuàng)建跳舞的子進(jìn)程    # group: 表示進(jìn)程組,目前只能使用None    # target: 表示執(zhí)行的目標(biāo)任務(wù)名(函數(shù)名、方法名)    # name: 進(jìn)程名稱, 默認(rèn)是Process-1, .....    dance_process = multiprocessing.Process(target=dance, name="myprocess1")    sing_process = multiprocessing.Process(target=sing)    # 啟動(dòng)子進(jìn)程執(zhí)行對(duì)應(yīng)的任務(wù)    dance_process.start()    sing_process.start()

            執(zhí)行結(jié)果:

            唱歌中...跳舞中...唱歌中...跳舞中...唱歌中...跳舞中...唱歌中...跳舞中...唱歌中...跳舞中...

            二、進(jìn)程有哪些注意點(diǎn)

            1、進(jìn)程之間不共享全局變量

            代碼:

            import multiprocessingimport time# 定義全局變量g_list = list()# 添加數(shù)據(jù)的任務(wù)def add_data():    for i in range(5):        g_list.append(i)        print("add:", i)        time.sleep(0.2)    # 代碼執(zhí)行到此,說明數(shù)據(jù)添加完成    print("add_data:", g_list)def read_data():    print("read_data", g_list)if __name__ == '__main__':    # 創(chuàng)建添加數(shù)據(jù)的子進(jìn)程    add_data_process = multiprocessing.Process(target=add_data)    # 創(chuàng)建讀取數(shù)據(jù)的子進(jìn)程    read_data_process = multiprocessing.Process(target=read_data)    # 啟動(dòng)子進(jìn)程執(zhí)行對(duì)應(yīng)的任務(wù)    add_data_process.start()    # 主進(jìn)程等待添加數(shù)據(jù)的子進(jìn)程執(zhí)行完成以后程序再繼續(xù)往下執(zhí)行,讀取數(shù)據(jù)    add_data_process.join()    read_data_process.start()    print("main:", g_list)    # 總結(jié): 多進(jìn)程之間不共享全局變量

            執(zhí)行結(jié)果:

            add: 0
            add: 1
            add: 2
            add: 3
            add: 4
            add_data: [0, 1, 2, 3, 4]
            main: []
            read_data []

            創(chuàng)建子進(jìn)程會(huì)對(duì)主進(jìn)程資源進(jìn)行拷貝,也就是說子進(jìn)程是主進(jìn)程的一個(gè)副本,好比是一對(duì)雙胞胎,之所以進(jìn)程之間不共享全局變量,是因?yàn)椴僮鞯牟皇峭粋€(gè)進(jìn)程里面的全局變量,只不過不同進(jìn)程里面的全局變量名字相同而已。

            2、主進(jìn)程會(huì)等待所有的子進(jìn)程執(zhí)行結(jié)束再結(jié)束

            假如我們現(xiàn)在創(chuàng)建一個(gè)子進(jìn)程,這個(gè)子進(jìn)程執(zhí)行完大概需要2秒鐘,現(xiàn)在讓主進(jìn)程執(zhí)行0.5秒鐘就退出程序,查看一下執(zhí)行結(jié)果,示例代碼如下:

            import multiprocessingimport time# 定義進(jìn)程所需要執(zhí)行的任務(wù)def task():    for i in range(10):        print("任務(wù)執(zhí)行中...")        time.sleep(0.2)if __name__ == '__main__':    # 創(chuàng)建子進(jìn)程    sub_process = multiprocessing.Process(target=task)    sub_process.start()    # 主進(jìn)程延時(shí)0.5秒鐘    time.sleep(0.5)    print("over")    exit()    # 總結(jié):主進(jìn)程會(huì)等待所有的子進(jìn)程執(zhí)行完成以后程序再退出

            執(zhí)行結(jié)果:

            任務(wù)執(zhí)行中...任務(wù)執(zhí)行中...任務(wù)執(zhí)行中...over任務(wù)執(zhí)行中...任務(wù)執(zhí)行中...任務(wù)執(zhí)行中...任務(wù)執(zhí)行中...任務(wù)執(zhí)行中...任務(wù)執(zhí)行中...任務(wù)執(zhí)行中...

            說明:通過上面代碼的執(zhí)行結(jié)果,我們可以得知:主進(jìn)程會(huì)等待所有的子進(jìn)程執(zhí)行結(jié)束再結(jié)束。

            假如我們就讓主進(jìn)程執(zhí)行0.5秒鐘,子進(jìn)程就銷毀不再執(zhí)行,那怎么辦呢?我們可以設(shè)置守護(hù)主進(jìn)程或者在主進(jìn)程退出之前讓子進(jìn)程銷毀:

            守護(hù)主進(jìn)程:守護(hù)主進(jìn)程就是主進(jìn)程退出子進(jìn)程銷毀不再執(zhí)行子進(jìn)程銷毀:子進(jìn)程執(zhí)行結(jié)束

            保證主進(jìn)程正常退出的示例代碼:

            import multiprocessingimport time# 定義進(jìn)程所需要執(zhí)行的任務(wù)def task():    for i in range(10):        print("任務(wù)執(zhí)行中...")        time.sleep(0.2)if __name__ == '__main__':    # 創(chuàng)建子進(jìn)程    sub_process = multiprocessing.Process(target=task)    # 設(shè)置守護(hù)主進(jìn)程,主進(jìn)程退出子進(jìn)程直接銷毀,子進(jìn)程的生命周期依賴與主進(jìn)程    # sub_process.daemon = True    sub_process.start()    time.sleep(0.5)    print("over")    # 讓子進(jìn)程銷毀    sub_process.terminate()    exit()    # 總結(jié):主進(jìn)程會(huì)等待所有的子進(jìn)程執(zhí)行完成以后程序再退出    # 如果想要主進(jìn)程退出子進(jìn)程銷毀,可以設(shè)置守護(hù)主進(jìn)程或者在主進(jìn)程退出之前讓子進(jìn)程銷毀

            執(zhí)行結(jié)果:

            任務(wù)執(zhí)行中...任務(wù)執(zhí)行中...任務(wù)執(zhí)行中...over

            三、Python多線程的通信

            進(jìn)程是系統(tǒng)獨(dú)立調(diào)度核分配系統(tǒng)資源(CPU、內(nèi)存)的基本單位,進(jìn)程之間是相互獨(dú)立的,每啟動(dòng)一個(gè)新的進(jìn)程相當(dāng)于把數(shù)據(jù)進(jìn)行了一次克隆,子進(jìn)程里的數(shù)據(jù)修改無法影響到主進(jìn)程中的數(shù)據(jù),不同子進(jìn)程之間的數(shù)據(jù)也不能共享,這是多進(jìn)程在使用中與多線程最明顯的區(qū)別。但是難道Python多進(jìn)程中間難道就是孤立的嗎?當(dāng)然不是,python也提供了多種方法實(shí)現(xiàn)了多進(jìn)程中間的通信和數(shù)據(jù)共享(可以修改一份數(shù)據(jù))。

            1、進(jìn)程對(duì)列Queue

            Queue在多線程中也說到過,在生成者消費(fèi)者模式中使用,是線程安全的,是生產(chǎn)者和消費(fèi)者中間的數(shù)據(jù)管道,那在python多進(jìn)程中,它其實(shí)就是進(jìn)程之間的數(shù)據(jù)管道,實(shí)現(xiàn)進(jìn)程通信。

            from multiprocessing import Process,Queuedef fun1(q,i):    print('子進(jìn)程%s 開始put數(shù)據(jù)' %i)    q.put('我是%s 通過Queue通信' %i)if __name__ == '__main__':    q = Queue()    process_list = []    for i in range(3):        p = Process(target=fun1,args=(q,i,))  #注意args里面要把q對(duì)象傳給我們要執(zhí)行的方法,這樣子進(jìn)程才能和主進(jìn)程用Queue來通信        p.start()        process_list.append(p)    for i in process_list:        p.join()    print('主進(jìn)程獲取Queue數(shù)據(jù)')    print(q.get())    print(q.get())    print(q.get())    print('結(jié)束測試')

            結(jié)果:

            子進(jìn)程0 開始put數(shù)據(jù)子進(jìn)程1 開始put數(shù)據(jù)子進(jìn)程2 開始put數(shù)據(jù)主進(jìn)程獲取Queue數(shù)據(jù)我是0 通過Queue通信我是1 通過Queue通信我是2 通過Queue通信結(jié)束測試Process finished with exit code 0

            上面的代碼結(jié)果可以看到我們主進(jìn)程中可以通過Queue獲取子進(jìn)程中put的數(shù)據(jù),實(shí)現(xiàn)進(jìn)程間的通信。

            2、管道Pipe

            管道Pipe和Queue的作用大致差不多,也是實(shí)現(xiàn)進(jìn)程間的通信。

            from multiprocessing import Process, Pipedef fun1(conn):    print('子進(jìn)程發(fā)送消息:')    conn.send('你好主進(jìn)程')    print('子進(jìn)程接受消息:')    print(conn.recv())    conn.close()if __name__ == '__main__':    conn1, conn2 = Pipe() #關(guān)鍵點(diǎn),pipe實(shí)例化生成一個(gè)雙向管    p = Process(target=fun1, args=(conn2,)) #conn2傳給子進(jìn)程    p.start()    print('主進(jìn)程接受消息:')    print(conn1.recv())    print('主進(jìn)程發(fā)送消息:')    conn1.send("你好子進(jìn)程")    p.join()    print('結(jié)束測試')

            結(jié)果:

            主進(jìn)程接受消息:子進(jìn)程發(fā)送消息:子進(jìn)程接受消息:你好主進(jìn)程主進(jìn)程發(fā)送消息:你好子進(jìn)程結(jié)束測試Process finished with exit code 0

            上面可以看到主進(jìn)程和子進(jìn)程可以相互發(fā)送消息。

            3、Managers

            Queue和Pipe只是實(shí)現(xiàn)了數(shù)據(jù)交互,并沒實(shí)現(xiàn)數(shù)據(jù)共享,即一個(gè)進(jìn)程去更改另一個(gè)進(jìn)程的數(shù)據(jù)。那么就要用到Managers。

            from multiprocessing import Process, Managerdef fun1(dic,lis,index):    dic[index] = 'a'    dic['2'] = 'b'        lis.append(index)    #[0,1,2,3,4,0,1,2,3,4,5,6,7,8,9]    #print(l)if __name__ == '__main__':    with Manager() as manager:        dic = manager.dict()#注意字典的聲明方式,不能直接通過{}來定義        l = manager.list(range(5))#[0,1,2,3,4]        process_list = []        for i in range(10):            p = Process(target=fun1, args=(dic,l,i))            p.start()            process_list.append(p)        for res in process_list:            res.join()        print(dic)        print(l)

            結(jié)果:

            {0: 'a', '2': 'b', 3: 'a', 1: 'a', 2: 'a', 4: 'a', 5: 'a', 7: 'a', 6: 'a', 8: 'a', 9: 'a'}[0, 1, 2, 3, 4, 0, 3, 1, 2, 4, 5, 7, 6, 8, 9]

            可以看到主進(jìn)程定義了一個(gè)字典和一個(gè)列表,在子進(jìn)程中,可以添加和修改字典的內(nèi)容,在列表中插入新的數(shù)據(jù),實(shí)現(xiàn)進(jìn)程間的數(shù)據(jù)共享,即可以共同修改同一份數(shù)據(jù)。

            延伸閱讀1:Python協(xié)程簡介

            協(xié)程,又稱微線程,纖程,英文名Coroutine。協(xié)程的作用是在執(zhí)行函數(shù)A時(shí)可以隨時(shí)中斷去執(zhí)行函數(shù)B,然后中斷函數(shù)B繼續(xù)執(zhí)行函數(shù)A(可以自由切換)。但這一過程并不是函數(shù)調(diào)用,這一整個(gè)過程看似像多線程,然而協(xié)程只有一個(gè)線程執(zhí)行。

            聲明:本站稿件版權(quán)均屬千鋒教育所有,未經(jīng)許可不得擅自轉(zhuǎn)載。
            10年以上業(yè)內(nèi)強(qiáng)師集結(jié),手把手帶你蛻變精英
            請(qǐng)您保持通訊暢通,專屬學(xué)習(xí)老師24小時(shí)內(nèi)將與您1V1溝通
            免費(fèi)領(lǐng)取
            今日已有369人領(lǐng)取成功
            劉同學(xué) 138****2860 剛剛成功領(lǐng)取
            王同學(xué) 131****2015 剛剛成功領(lǐng)取
            張同學(xué) 133****4652 剛剛成功領(lǐng)取
            李同學(xué) 135****8607 剛剛成功領(lǐng)取
            楊同學(xué) 132****5667 剛剛成功領(lǐng)取
            岳同學(xué) 134****6652 剛剛成功領(lǐng)取
            梁同學(xué) 157****2950 剛剛成功領(lǐng)取
            劉同學(xué) 189****1015 剛剛成功領(lǐng)取
            張同學(xué) 155****4678 剛剛成功領(lǐng)取
            鄒同學(xué) 139****2907 剛剛成功領(lǐng)取
            董同學(xué) 138****2867 剛剛成功領(lǐng)取
            周同學(xué) 136****3602 剛剛成功領(lǐng)取
            相關(guān)推薦HOT
            mysql group commit為什么要保證binlog和redo log提交的順序一致?

            一、為什么要保證binlog和redo log提交的順序一致MySQL為了保證master和slave的數(shù)據(jù)一致性,就必須保證binlog和InnoDB redo日志的一致性(因?yàn)?..詳情>>

            2023-10-13 08:25:24
            synchronized鎖的升級(jí)原理是什么,以及各個(gè)鎖的狀態(tài)對(duì)比?

            一、synchronized鎖的基本原理synchronized是Java中用于實(shí)現(xiàn)線程安全的關(guān)鍵字,它可以應(yīng)用于方法或代碼塊。當(dāng)一個(gè)線程進(jìn)入synchronized代碼塊時(shí)...詳情>>

            2023-10-13 08:14:11
            database schema 和database instance 有什么區(qū)別?

            一、database schema 和database instance的區(qū)別schema是數(shù)據(jù)庫的組織和結(jié)構(gòu),包含了表、列、數(shù)據(jù)類型、視圖、存儲(chǔ)過程等。schema可以理解為是...詳情>>

            2023-10-13 08:11:44
            mysql使用into outfile導(dǎo)出數(shù)據(jù),提示權(quán)限不足,怎么解決呢?

            一、mysql使用into outfile導(dǎo)出數(shù)據(jù),提示權(quán)限不足,怎么解決將數(shù)據(jù)庫中某一表格導(dǎo)出:select * from 表名 into outfile ‘C:\Users\asill\Desk...詳情>>

            2023-10-13 08:09:40
            Mysql怎么把圖片轉(zhuǎn)換的base64以字符串的類型存入數(shù)據(jù)庫?

            一、Mysql怎么把圖片轉(zhuǎn)換的base64以字符串的類型存入數(shù)據(jù)庫MySQL沒有內(nèi)置功能可以實(shí)現(xiàn)此功能,但可以使用以下步驟實(shí)現(xiàn):1. 使用PHP或其他編程語...詳情>>

            2023-10-13 08:05:09
            快速通道