簡單的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多程序上碰到的坑 建立...