簡單的Python 多程序非同步處理 王晨的部落格

2021-09-06 07:50:37 字數 2245 閱讀 1000

簡單的python 多程序非同步處理 | 王晨的部落格

posted on may 30, 2011 by wangchen

它啟動後,監視佇列,如果有新的請求進來,就fork 乙個子程序去處理。

為了更易理解,刪減了一些異常處理、日誌等**。

#!/usr/bin/env python

#encoding: utf-8

import logging

import os

import time

class queue(object):

'''基類,佇列的抽象介面

'''def pop(self):

pass

class queueobserver:

'''監視佇列,若發現請求,建立新的程序處理之

'''def __init__(self, queue, func, max=1, sleepinterval=0.1):

'''queue - 必選,佇列物件,必須繼承自queue 類,並實現pop 方法

func - 必選,要執行的函式引用

max - 可選,最多啟動多少個程序,預設為1,單程序

sleepinterval - 可選,預設為0.1秒

'''self.children =

self.queue = queue

assert queue

self.func = func

assert func

self.max = max

self.sleepinterval = sleepinterval

def start(self):

while true:

item = self.queue.pop()

if item == none:

# empty queue, sleepinterval and check it again

time.sleep(self.sleepinterval)

continue

# got a job

pid = os.fork()

if pid:

# the parent

self.collect_children()

while len(self.children) >= self.max:

# limit the number of forked processes

self.collect_children()

time.sleep(self.sleepinterval)

else:

# the child

ecode = 0

self.func(item)

logging.debug('p-%d has done: %s.' % (os.getpid(), item))

os._exit(ecode)

def collect_children(self):

'''清理已完成的子程序

'''while self.children:

try:

pid, status = os.waitpid(0, os.wnohang)

except os.error:

pid = none

if pid:

self.children.remove(pid)

else:

break

if __name__ == '__main__':

import redis

class redisqueue(queue):

'''演示用的實現,基於redis 的佇列

'''def __init__(self, host, port, key):

self.r = redis.redis(host, port)

self.key = key

def pop(self):

return self.r.rpop(self.key)

def test(x):

logging.info(int(x) * 2)

logging.basicconfig(level=logging.debug)

q = redisqueue('localhost', 6300, 'q')

qo = queueobserver(q,test)

qo.start()

python多程序非同步併發處理

如下將實現乙個簡單的多程序,非同步的,併發機制 1.一些初始定義 import multiprocessing aaa 多個程序公用的公共變數 用於多個程序同時要處理的那個變數 將用於多程序分布式散開的乙個原本list for遍歷將做12次 test list 3,4,5,6,7,8,9,10,11...

python多程序 python多程序

當有多個非相關任務需要處理時,並行能大大提高處理速度。這裡簡要介紹python的multiprocessing模組。簡單多程序編寫 當我們任務數量確定而且比較少的時候,可以手動為每個任務指定乙個程序來執行。import multiprocessing as mp def f a print a if...

python多程序的坑 Python多程序相關的坑

python的multiprocessing模組實現了多程序功能,但官方文件上只有一些比較簡單的用法,主要是使用函式作為process的target,而如何在class中使用多程序並沒有多講解。google出兩篇比較詳細的文章,建議從它們入門 下面記錄一下自己這週在python多程序上碰到的坑 建立...