目前專案中有個工作是使用python定時處理資料庫中的任務,之前是每個任務都起乙個執行緒進行處理,隨著任務數的增多,起的執行緒也越來越多,最終出現記憶體溢位情況。
#python的執行緒池實現
import queue
import threading
import sys
import time
import urllib
import log
#替我們工作的執行緒池中的執行緒
class mythread(threading.thread):
def __init__( workqueue, timeout=30, **kwargs):
threading.thread.__init__( kwargs=kwargs)
#執行緒在結束前等待任務佇列多長時間
timeout = timeout
setdaemon(true)
workqueue = workqueue
start()
def run(self):
while true:
try:
#從工作佇列中獲取乙個任務
callable, args, kwargs = workqueue.get(timeout = timeout)
#我們要執行的任務
callable(args, kwargs)
#任務佇列空的時候結束此執行緒
except queue.empty:
break
except :
print sys.exc_info()
raise
class threadpool:
def __init__( num_of_threads=10):
workqueue = queue.queue()
threads =
__createthreadpool( num_of_threads )
def __createthreadpool( num_of_threads ):
for i in range( num_of_threads ):
thread = mythread( workqueue )
def wait_for_complete():
#等待所有執行緒完成。
while len(threads):
thread = threads.pop()
#等待執行緒結束
if thread.isalive():#判斷執行緒是否還存活來決定是否呼叫join
thread.join()
def add_job( callable, *args, **kwargs ):
workqueue.put( (callable,args,kwargs) )
def main():
threadpool = threadpool(10)
for task in tasklist:
threadpool.add_job(task, *args, **kwargs)
threadpool.wait_for_complete()
if __name__ == '__main__':
main()
python學習筆記(五)
python裡的流程控制語句 if expression statements s else statements s identationerror 縮排錯誤,縮排4個空格 true 非空的值 string,tuple,list,set,dict false 0,null,其他空值 需要多次判斷使...
python 學習筆記 (五)
遞迴函式,如果乙個函式在內部呼叫自身本身,這個函式就是遞迴函式。該包下的iterable方法是用來判斷物件是否可以迭代 from collections import iterable 遞迴算階乘 def fact n if n 1 return 1 return n fact n 1 print ...
Python學習筆記(五)
set set 持有一系列元素,這一點和 list 很像,但是set的元素沒有重複,而且是無序的,這點和 dict 的 key很像。建立 呼叫 set 並傳入乙個 list,list的元素將作為set的元素 s set a b c set會自動去掉重複的元素。訪問 由於set儲存的是無序集合,所以我...