python多線程并發,Python并發機制的實現(一)——多進程

 2023-12-25 阅读 27 评论 0

摘要:Python并發機制的實現(一) —— 多進程Unix/Linux系統調用實現多進程(Windows系統不支持)Unix/Linux操作系統提供了一個fork()系統調用,它非常特殊。普通的函數調用,調用一次,返回一次,但是fork()調用一次,返回兩次,因為操作系統自

Python并發機制的實現(一) —— 多進程
Unix/Linux系統調用實現多進程(Windows系統不支持)
Unix/Linux操作系統提供了一個fork()系統調用,它非常特殊。普通的函數調用,調用一次,返回一次,但是fork()調用一次,返回兩次,因為操作系統自動把當前進程(稱為父進程)復制了一份(稱為子進程),然后,分別在父進程和子進程內返回。

子進程永遠返回0,而父進程返回子進程的ID。這樣做的理由是,一個父進程可以fork出很多子進程,所以,父進程要記下每個子進程的ID,而子進程只需要調用getppid()就可以拿到父進程的ID。

python多線程并發,#coding=utf-8
import os
import time

pid = os.fork()

#子進程
if pid==0:
while True:
print "child process {}".format(os.getpid())
time.sleep(2)
#父進程
else:
while True:
print "parent process {}".format(os.getppid())
time.sleep(2)

運行結果:

Java程序的并發機制是、parent process 3614
child process 3761
child process 3761
parent process 3614
child process 3761
parent process 3614
^\退出 (核心已轉儲)

有了fork調用,一個進程在接到新任務時就可以復制出一個子進程來處理新任務,常見的Apache服務器就是由父進程監聽端口,每當有新的http請求時,就fork出子進程來處理新的http請求。

multiprocessing模塊
使用multiprocessing模塊可以兼容windows操作系統,具體可見源碼中python2.7中multiprocessing下的forking.py

#coding=utf-8
import time
import os
from multiprocessing import Process

def p1():
while True:
for i in range(5):
print 'pro1' + ' ' + str(os.getpid())
time.sleep(2)

def p2(name):
while True:
for i in range(5):
print name + ' ' + str(os.getpid())
time.sleep(2)

pro1 = Process()
pro2 = Process(target=p2, args=("pro2",))
#重寫run函數為p1
pro1.run = p1
pro2.start()
pro2.start()
pro1.join()
pro2.join()

!注意其中的run函數,在python2.7multiprocessing模塊中的源碼為

def run(self):
'''
Method to be run in sub-process; can be overridden in sub-class
'''
#如果參數中傳入目標函數則運行目標函數
if self._target:
self._target(*self._args, **self._kwargs)

分析源碼可知創建進程實例后調用start方法啟動線程通過一系列異常檢測后將自動調用run方法

join方法是用來等待指定子進程的結束,再結束主進程即父進程,避免僵尸進程的產生

Pool模塊(進程池)
Pool可以提供指定數量的進程,供用戶調用,當有新的請求提交到pool中時,如果池還沒有滿,那么就會創建一個新的進程用來執行該請求;但如果池中的進程數已經達到規定最大值,那么該請求就會等待,直到池中有進程結束,才會創建新的進程來它.進程池可以讓你跑滿多核CPU,而且使用方法非常簡單.

#coding=utf-8

from multiprocessing import Pool
import time

def f(x):
for i in range(10):
print i,'-----------',x
time.sleep(1)

def main():
#控制進程池的大小為4個進程(可以自行改動測試)
pool = Pool(processes=4)
for x in range(10):
#添加進程入進程池,注意加"_async",apply為阻塞版本,參數分別為target和args
result = pool.apply_async(f,(x*10,))
pool.close()
pool.join()
if result.successful():
print 'successful'

if __name__ == "__main__":
main()

運行此程序發現每次最多只有四個進程并行執行,運行結果如下:

0 ----------- 0
0 ----------- 10
0 ----------- 20
0 ----------- 30
1 ----------- 0
1 ----------- 10
1 ----------- 30
1 ----------- 20
2 ----------- 0
2 ----------- 10
2 ----------- 20
2 ----------- 30
...
8 ----------- 90
8 ----------- 80
9 ----------- 80
9 ----------- 90
successful
---------------------
作者:Always0nTheWay
來源:CSDN
原文:https://blog.csdn.net/wukai_std/article/details/53268006
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!

轉載于:https://www.cnblogs.com/sunmoon1993/p/10036465.html

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/2/194916.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息