Python實(shí)現(xiàn)的自定義多線程多進(jìn)程類示例
本文實(shí)例講述了Python實(shí)現(xiàn)的自定義多線程多進(jìn)程類。分享給大家供大家參考,具體如下:
最近經(jīng)常使用到對(duì)大量文件進(jìn)行操作的程序以前每次寫的時(shí)候都要在函數(shù)中再寫一個(gè)多線程多進(jìn)程的函數(shù),做了些重復(fù)的工作遇到新的任務(wù)時(shí)還要重寫,因此將多線程與多進(jìn)程的一些簡(jiǎn)單功能寫成一個(gè)類,方便使用。功能簡(jiǎn)單只為以后方便使用。
使用中發(fā)現(xiàn)bug會(huì)再進(jìn)行更新
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2017/5/10 12:47
# @Author : zhaowen.zhu
# @Site :
# @File : MultiThread.py
# @Software: Python Idle
import threading,time,sys,multiprocessing
from multiprocessing import Pool
class MyTMultithread(threading.Thread):
'''''
自定義的線程函數(shù),
功能:使用多線程運(yùn)行函數(shù),函數(shù)的參數(shù)只有一個(gè)file,并且未實(shí)現(xiàn)結(jié)果值的返回
args:
filelist 函數(shù)的參數(shù)為列表格式,
funname 函數(shù)的名字為字符串,函數(shù)僅有一個(gè)參數(shù)為file
delay 每個(gè)線程之間的延遲,
max_threads 線程的最大值
'''
def __init__(self,filelist,delay,funname,max_threads = 50):
threading.Thread.__init__(self)
self.funname = funname
self.filelist = filelist[:]
self.delay = delay
self.max_threads = max_threads
def startrun(self):
def runs():
time.sleep(self.delay)
while True:
try:
file = self.filelist.pop()
except IndexError as e:
break
else:
self.funname(file)
threads = []
while threads or self.filelist:
for thread in threads:
if not thread.is_alive():
threads.remove(thread)
while len(threads) < self.max_threads and self.filelist:
thread = threading.Thread(target = runs)
thread.setDaemon(True)
thread.start()
threads.append(thread)
class Mymultiprocessing (MyTMultithread):
'''''
多進(jìn)程運(yùn)行函數(shù),多進(jìn)程多線程運(yùn)行函數(shù)
args:
filelist 函數(shù)的參數(shù)為列表格式,
funname 函數(shù)的名字為字符串,函數(shù)僅有一個(gè)參數(shù)為file
delay 每個(gè)線程\進(jìn)程之間的延遲,
max_threads 最大的線程數(shù)
max_multiprocess 最大的進(jìn)程數(shù)
'''
def __init__(self,filelist,delay,funname,max_multiprocess = 1,max_threads = 1):
self.funname = funname
self.filelist = filelist[:]
self.delay = delay
self.max_threads = max_threads
self.max_multiprocess = max_multiprocess
self.num_cpus = multiprocessing.cpu_count()
def multiprocessingOnly(self):
'''''
只使用多進(jìn)程
'''
num_process = min(self.num_cpus,self.max_multiprocess)
processes = []
while processes or self.filelist:
for p in processes:
if not p.is_alive():
# print(p.pid,p.name,len(self.filelist))
processes.remove(p)
while len(processes) < num_process and self.filelist:
try:
file = self.filelist.pop()
except IndexError as e:
break
else:
p = multiprocessing.Process(target=self.funname,args=(file,))
p.start()
processes.append(p)
def multiprocessingThreads(self):
num_process = min(self.num_cpus,self.max_multiprocess)
p = Pool(num_process)
DATALISTS = []
tempmod = len(self.filelist) % (num_process)
CD = int((len(self.filelist) + 1 + tempmod)/ (num_process))
for i in range(num_process):
if i == num_process:
DATALISTS.append(self.filelist[i*CD:-1])
DATALISTS.append(self.filelist[(i*CD):((i+1)*CD)])
try:
processes = []
for i in range(num_process):
#print('wait add process:',i+1,time.clock())
#print(eval(self.funname),DATALISTS[i])
MultThread = MyTMultithread(DATALISTS[i],self.delay,self.funname,self.max_threads)
p = multiprocessing.Process(target=MultThread.startrun())
#print('pid & name:',p.pid,p.name)
processes.append(p)
for p in processes:
print('wait join ')
p.start()
print('waite over')
except Exception as e:
print('error :',e)
print ('end process')
def func1(file):
print(file)
if __name__ == '__main__':
a = list(range(0,97))
'''''
測(cè)試使用5線程
'''
st = time.clock()
asc = MyTMultithread(a,0,'func1',5)
asc.startrun()
end = time.clock()
print('*'*50)
print('多線程使用時(shí)間:',end-st)
#測(cè)試使用5個(gè)進(jìn)程
st = time.clock()
asd = Mymultiprocessing(a,0,'func1',5)
asd.multiprocessingOnly()
end = time.clock()
print('*'*50)
print('多進(jìn)程使用時(shí)間:',end-st)
#測(cè)試使用5進(jìn)程10線程
st = time.clock()
multiPT = Mymultiprocessing(a,0,'func1',5,10)
multiPT.multiprocessingThreads()
end = time.clock()
print('*'*50)
print('多進(jìn)程多線程使用時(shí)間:',end-st)
更多關(guān)于Python相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Python進(jìn)程與線程操作技巧總結(jié)》、《Python Socket編程技巧總結(jié)》、《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》、《Python入門與進(jìn)階經(jīng)典教程》及《Python文件與目錄操作技巧匯總》
希望本文所述對(duì)大家Python程序設(shè)計(jì)有所幫助。
相關(guān)文章
Python環(huán)境管理virtualenv&virtualenvwrapper的配置詳解
這篇文章主要介紹了Python環(huán)境管理virtualenv&virtualenvwrapper的配置詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07
pycharm debug功能實(shí)現(xiàn)跳到循環(huán)末尾的方法
今天小編就為大家分享一篇pycharm debug功能實(shí)現(xiàn)跳到循環(huán)末尾的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-11-11
解決Python 中JSONDecodeError: Expecting value:&n
這篇文章主要介紹了解決Python 中JSONDecodeError: Expecting value: line 1 column 1 (char 0)錯(cuò)誤問題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-03-03
如何用python獲取到照片拍攝時(shí)的詳細(xì)位置(附源碼)
其實(shí)我們平時(shí)拍攝的照片里,隱藏了大量的信息,下面這篇文章主要給大家介紹了關(guān)于如何用python獲取到照片拍攝時(shí)的詳細(xì)位置,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-12-12
python批量識(shí)別圖片指定區(qū)域文字內(nèi)容
這篇文章主要為大家詳細(xì)介紹了python識(shí)別圖片指定區(qū)域文字內(nèi)容,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-04-04
python中pip安裝、升級(jí)以及升級(jí)固定的包
我們知道python有大量的第三方庫,這也是python的優(yōu)勢(shì)之一,pip就是python整的軟件包管理系統(tǒng),類似于Linux平臺(tái)的yum倉(cāng)庫,下面這篇文章主要給大家介紹了關(guān)于python中pip安裝、升級(jí)以及升級(jí)固定包的相關(guān)資料,需要的朋友可以參考下2022-02-02

