python(33)多进程和多线程的区别
多線程可以共享全局變量,多進程不能。多線程中,所有子線程的進程號相同;多進程中,不同的子進程進程號不同。
#!/usr/bin/python # -*- coding:utf-8 -*- import os import threading import multiprocessing count_thread = 0 count_process = 0# worker function def worker1(sign, lock):global count_threadlock.acquire()count_thread += 1print(sign, os.getpid())lock.release()def worker2(sign, lock):global count_processlock.acquire()count_process += 1print(sign, os.getpid())lock.release() # Main print('Main:',os.getpid())# Multi-thread record = [] lock = threading.Lock() for i in range(5):thread = threading.Thread(target=worker1,args=('thread',lock))thread.start()record.append(thread)for thread in record:thread.join()# Multi-process record = [] lock = multiprocessing.Lock() for i in range(5):process = multiprocessing.Process(target=worker2,args=('process',lock))process.start()record.append(process)for process in record:process.join()print count_thread print count_process?
運行結(jié)果
('Main:', 3142)
('thread', 3142)
('thread', 3142)
('thread', 3142)
('thread', 3142)
('thread', 3142)
('process', 3148)
('process', 3149)
('process', 3150)
('process', 3151)
('process', 3152)
5
0
應該盡量避免多進程共享資源。多進程共享資源必然會帶來進程間相互競爭。而這種競爭又會造成race condition,我們的結(jié)果有可能被競爭的不確定性所影響。但如果需要,我們依然可以通過共享內(nèi)存和Manager對象這么做。
1) 共享內(nèi)存
用Python實現(xiàn)的例子:
import multiprocessingdef f(n, a):n.value = 3.14a[0] = 5num = multiprocessing.Value('d', 0.0) arr = multiprocessing.Array('i', range(10))p = multiprocessing.Process(target=f, args=(num, arr)) p.start() p.join()print num.value print arr[:]?
這里我們實際上只有主進程和Process對象代表的進程。我們在主進程的內(nèi)存空間中創(chuàng)建共享的內(nèi)存,也就是Value和Array兩個對象。對象Value被設置成為雙精度數(shù)(d), 并初始化為0.0。而Array則類似于C中的數(shù)組,有固定的類型(i, 也就是整數(shù))。在Process進程中,我們修改了Value和Array對象。回到主程序,打印出結(jié)果,主程序也看到了兩個對象的改變,說明資源確實在兩個進程之間共享。
2)Manager
Manager對象類似于服務器與客戶之間的通信 (server-client),與我們在Internet上的活動很類似。我們用一個進程作為服務器,建立Manager來真正存放資源。其它的進程可以通過參數(shù)傳遞或者根據(jù)地址來訪問Manager,建立連接后,操作服務器上的資源。在防火墻允許的情況下,我們完全可以將Manager運用于多計算機,從而模仿了一個真實的網(wǎng)絡情境。下面的例子中,我們對Manager的使用類似于shared memory,但可以共享更豐富的對象類型。
import multiprocessingdef f(x, arr, l):x.value = 3.14arr[0] = 5l.append('Hello')server = multiprocessing.Manager() x = server.Value('d', 0.0) arr = server.Array('i', range(10)) l = server.list()proc = multiprocessing.Process(target=f, args=(x, arr, l)) proc.start() proc.join()print(x.value) print(arr) print(l)?
Manager利用list()方法提供了表的共享方式。實際上你可以利用dict()來共享詞典,Lock()來共享threading.Lock(注意,我們共享的是threading.Lock,而不是進程的mutiprocessing.Lock。后者本身已經(jīng)實現(xiàn)了進程共享)等。 這樣Manager就允許我們共享更多樣的對象。
參考資料:
http://blog.csdn.net/zhaozhi406/article/details/8137670
http://www.xuebuyuan.com/1968817.html
轉(zhuǎn)載于:https://www.cnblogs.com/lovychen/p/6478161.html
總結(jié)
以上是生活随笔為你收集整理的python(33)多进程和多线程的区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: js 实现网页显示倒计时
- 下一篇: 夏夜