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

?

運行結果

('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,我們的結果有可能被競爭的不確定性所影響。但如果需要,我們依然可以通過共享內存和Manager對象這么做。

1) 共享內存

用Python實現的例子:

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對象代表的進程。我們在主進程的內存空間中創建共享的內存,也就是Value和Array兩個對象。對象Value被設置成為雙精度數(d), 并初始化為0.0。而Array則類似于C中的數組,有固定的類型(i, 也就是整數)。在Process進程中,我們修改了Value和Array對象。回到主程序,打印出結果,主程序也看到了兩個對象的改變,說明資源確實在兩個進程之間共享。

2)Manager

Manager對象類似于服務器與客戶之間的通信 (server-client),與我們在Internet上的活動很類似。我們用一個進程作為服務器,建立Manager來真正存放資源。其它的進程可以通過參數傳遞或者根據地址來訪問Manager,建立連接后,操作服務器上的資源。在防火墻允許的情況下,我們完全可以將Manager運用于多計算機,從而模仿了一個真實的網絡情境。下面的例子中,我們對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。后者本身已經實現了進程共享)等。 這樣Manager就允許我們共享更多樣的對象。

參考資料:

http://blog.csdn.net/zhaozhi406/article/details/8137670

http://www.xuebuyuan.com/1968817.html

轉載于:https://www.cnblogs.com/lovychen/p/6478161.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/541801.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/541801.shtml
英文地址,請注明出處:http://en.pswp.cn/news/541801.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java FilterInputStream reset()方法與示例

FilterInputStream類的reset()方法 (FilterInputStream Class reset() method) reset() method is available in java.io package. reset()方法在java.io包中可用。 reset() method is used to reset this FilterInputStream to the position set by the most recent call of m…

不同php文件,php-不同文件夾的不同登錄(會話)

我有一個Web服務,需要用戶登錄并創建標準$_SESSION [‘XXX’]個用戶變量.我想為應用程序創建一個“演示”,因此為它創建了另一個文件夾.相同的代碼在那里,除了數據庫以外的所有東西.問題是,當用戶登錄這兩個帳戶之一時,它可以訪問兩個帳戶.因此,如果他登錄了演示應用程序,它將使…

Java Hashtable containsValue()方法與示例

哈希表類containsValue()方法 (Hashtable Class containsValue() method) containsValue() method is available in java.util package. containsValue()方法在java.util包中可用。 containsValue() method is used to check whether this table Hashtable associated one or m…

php session redis db,php session redis 配置

具體環境:一臺apachephp的服務器(yum安裝remi源及配置 httpd-2.2.15 php-5.4.45)一臺redis服務器(yum安裝remi源及配置 redis-3.2.6)保證apache服務器可以訪問redis服務器的6379端口具體步驟:1、在apachephp服務器上安裝redis擴展點擊(此處)折疊或打開yu…

sigprocmask, sigpending, sigsuspend的用法

sigset_t set sigemptyset(&set) :清空阻塞信號集合變量 sigfillset(&set) :添加所有的信號到阻塞集合變量里 sigaddset(&set,SIGINT):添加單一信號到阻塞信號集合變量 sigdelset(&set,SIGINT):從阻塞信號集合變量中刪除單一信號 void handler(int …

Java Calendar getDisplayName()方法與示例

日歷類的getDisplayName()方法 (Calendar Class getDisplayName() method) getDisplayName() method is available in java.util package. getDisplayName()方法在java.util包中可用。 getDisplayName() method is used to return string denotation of the given calendar fie…

matlab dir數,DIR - matlab函數

DIR List directory.DIR directory_name lists the files in a directory. Pathnames andwildcards may be used. For example, DIR *.m lists all the M-filesin the current directory.D DIR(‘directory_name‘) returns the results in an M-by-1structure with the field…

(四)其他的說明

2019獨角獸企業重金招聘Python工程師標準>>> 關于日志,主要是利用aop來實現的。cn.demoframe.test.frame.service.LogAspect,這里在方法前做了個切面setReqReachTime,設置了一個請求達到時間。接下來還有個切面,是在co…

Java LocalDate類| 帶示例的compareTo()方法

LocalDate類compareTo()方法 (LocalDate Class compareTo() method) compareTo() method is available in java.time package. compareTo()方法在java.time包中可用。 compareTo() method is used to compare this LocalDate object to the given object. compareTo()方法用于將…

vm中linux物理內存不足解決方案

為什么80%的碼農都做不了架構師?>>> 之前創建的一個center os,默認是8GB,經過一頓折磨,裝jdk,tomcat,redis,mycat,nginx,mysql,hadoop...終于,內存不足了,在使用docker build某鏡像的時候。迭代懵逼了&am…

matlab7.0 6.5,任何處理matlab6.5與7.0.1的兼容問題

mdl文件在6.5里面做的,但是到了7.0里面卻打不開,下面就是相關信息:Warning: Unable to load model file d:\MATLAB7\work\*.mdl. Run "bdclose all; set_param(0, CharacterEncoding, Enc)" where Enc is one of windows-1252, I…

Java BigInteger類| 帶有示例的減去()方法

BigInteger類減去()方法 (BigInteger Class subtract() method) subtract() method is available in java.math package. exclude()方法在java.math包中可用。 subtract() method is used to subtract the given value from the value of this BigInteger. exclude()方法用于從…

php刪除第一個字母,php – 正在上傳的文件將第一個字母切斷

我正在將網站從具有WS2003,IIS6,PHP 5.2的服務器遷移到具有WS2008,IIS7和PHP 5.3的服務器我有一個html表單,上傳文件到網站.if(isset($_POST["Upload"])){echo "";print_r($_POST);print_r($_FILES);echo "";}?>在舊服務器上工作得很好,但在…

.7z.001,.7z.002這樣的文件如何解壓

1 如圖所示,壓縮分卷沒有顯示關聯的軟件來打開,Winrar右擊也無法解壓 2 可以使用7-ZIP軟件打開該文件,然后選擇提取(相當于Winrar的解壓),然后選擇提取路徑,默認是同一個文件夾,點擊…

二進制 |_元二進制搜索| 單邊二元搜索

二進制 & |Meta Binary Search is a one-sided binary search where we work on the index using bit manipulation. We are to find the target index by using bit manipulation like the below example where the algorithm is explained. 元二進制搜索是一種單面二進制…

codeMirror配置

介紹 CodeMirror是一款在線的支持語法高亮的代碼編輯器。官網:http://codemirror.net/ 下載后,解壓開到的文件夾中,lib下是放的是核心庫和核心css,模式下放的是各種支持語言的語法定義,主題目錄下是支持的主題樣式。一…

應夢框架9.0框架_.Net框架能力問題和解答

應夢框架9.0框架This section contains Aptitude Questions and Answers on .Net Framework. 本節包含有關.Net Framework的能力問題和解答。 1) There are the following options are given below, what are parts of the .NET Framework? FCL (Framework Class Library)Web…

php中文網視頻放不了,【雜談】看php中文網視頻課程的正確姿勢!

看在線課程如何集中精力學習?ki4網為你分享看ki4網視頻課程的正確姿勢!不談理論給些實用建議,可以根據你的情況多嘗試,看看哪條對你有用!1、選一門自己有興趣而且教師講得好的課程。(點擊學習:ki4網視頻教程…

算法筆記_065:分治法求逆序對(Java)

目錄 1 問題描述 2 解決方案 2.1 蠻力法 2.2 分治法(歸并排序) 1 問題描述 給定一個隨機數數組,求取這個數組中的逆序對總個數。要求時間效率盡可能高。 那么,何為逆序對? 引用自百度百科: 設 A 為一個有 n…

c#copyto_String.CopyTo()方法以及C#中的示例

c#copytoC#String.CopyTo()方法 (C# String.CopyTo() Method) String.CopyTo() method is used to copy a specified number of characters from given indexes of the string to the specified position in a character array. String.CopyTo()方法用于將指定數量的…