Python併發機制的實現 一 多程序

2022-08-21 05:15:11 字數 2365 閱讀 9285

python併發機制的實現(一) —— 多程序

unix/linux系統呼叫實現多程序(windows系統不支援)

unix/linux作業系統提供了乙個fork()系統呼叫,它非常特殊。普通的函式呼叫,呼叫一次,返回一次,但是fork()呼叫一次,返回兩次,因為作業系統自動把當前程序(稱為父程序)複製了乙份(稱為子程序),然後,分別在父程序和子程序內返回。

子程序永遠返回0,而父程序返回子程序的id。這樣做的理由是,乙個父程序可以fork出很多子程序,所以,父程序要記下每個子程序的id,而子程序只需要呼叫getppid()就可以拿到父程序的id。

#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)

執行結果:

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)

if __name__ == "__main__":

main()

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

資料庫一對一,多對一,多對多的關係

關聯對映 一對多 多對一 存在最普遍的對映關係,簡單來講就如球員與球隊的關係 一對多 從球隊角度來說乙個球隊擁有多個球員 即為一對多 多對一 從球員角度來說多個球員屬於乙個球隊 即為多對一 資料表間一對多關係如下圖 關聯對映 一對一 一對一關係就如球隊與球隊所在位址之間的關係,一支球隊僅有乙個位址,...

Rust的併發程式設計(一)多程序併發

併發,是指在巨集觀意義上同一時間處理多個任務。併發的方式一般包含為三種 多程序 多執行緒以及最近幾年剛剛火起來的協程。首先,我們建立兩個專案,乙個為子程序,乙個為主程序。在子程序的main.rs中,編寫如下 use std thread sleep use std time duration fn ...

多對一,多對對的配置檔案

多對一 多方配置 column如果與資料庫一致可以省略 一方配置 類中有set集合,在hbm中就要配置set集合 類中沒有set集合,在hbm中就直接配置關係 注意 兩個配置檔案的外來鍵必須對應!resource cn itcast a oneto many customer.hbm.xml res...