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...