थोड़ी देर के साथ फ़ंक्शन के लिए मल्टीथ्रेडिंग का उपयोग करना? - पायथन, मल्टीथ्रेडिंग, मल्टीप्रोसेसिंग

मेरे पास एक बहुत ही बुनियादी कार्य है जो इसके माध्यम से हैएक निर्देशिका, फ़ाइलों को पढ़ना और डेटा एकत्र करना, हालांकि यह इस तरह से बहुत धीमा है और केवल प्रसंस्करण शक्ति के लिए प्रत्येक कोर (क्वाड-कोर i5 सीपीयू) के लगभग एक चौथाई का उपयोग करता है। मैं एक साथ 4 बार फ़ंक्शन कैसे चला सकता हूं। क्योंकि यह एक बहुत बड़ी निर्देशिका के माध्यम से जा रहा है, मैं पैरामीटर का उपयोग कर सकते हैं random.shuffle ()? यहाँ "मैं अब कोड है:"

import multiprocessing

def function():
while True:
pass #do the code. variables are assigned inside the function.

with Pool(processes=4) as pool:
pool.map(function)

क्योंकि फ़ंक्शन कोई पैरामीटर नहीं लेता है, मैं क्या कर सकता हूं

उत्तर:

जवाब के लिए 3 № 1

मैंने नहीं किया map(), यह कहा जाता है कि नक्शा केवल एक पुनरावृत्त तर्क लेता है, सैद्धांतिक रूप से, आप या तो अपने को संशोधित करते हैं fuction() सेवा मेरे function(one_arg) या एक खाली सूची या टपल या अन्य चलने योग्य संरचना का उपयोग करने का प्रयास करें, लेकिन मैंने इसे परीक्षण नहीं किया।

मेरा सुझाव है कि आप सभी फाइलों को कतार में रखें (हो सकता है)प्रक्रियाओं द्वारा साझा किया गया), और कतार को कई प्रक्रियाओं में साझा करें (आपके मामले में यह 4 है)। फ़ाइल को पढ़ने के बाद छोड़ने के लिए प्रयास-सिवाय उपयोग करें। फ़ाइलों की कतार का उपभोग करने के लिए 4 प्रक्रियाएँ बनाता है और सभी फ़ाइलों के संसाधित होने तक छोड़ देता है।

आपके लिए यह बताना आसान है कि क्या अधिक फ़ाइलों को पढ़ने की आवश्यकता है या नहीं Queue.Empty तथा TimeoutError

from multiprocessing import Process
import Queue

def function(files_queue):
try:
filename = files_queue.get(timeout=60)  # set timeout
with open(filename) as inputs:
# process lines
# time consuming work is here
except (multiprocessing.TimeoutError, Queue.Empty) as toe:
# queue is empty or timeout
break

if __name__ == "__main__":
files_queue = ...  # put all files into queue
processes = list()

# here you need a loop to create 4/multiple processes
p = Process(target=function, args=(files_queue,))

processes.add(p)
p.start()

for pro in processes:
pro.join()

उत्तर के लिए -2 № 2

यह विधि pool.map(function) 4 धागे बनाएंगे, वास्तव में 4 प्रक्रियाएं नहीं। यह सब "मल्टीप्रोसेसिंग" एक ही प्रक्रिया में 4 थ्रेड्स के साथ होगा।

मेरा सुझाव है कि इसका उपयोग करना है multiprocessing.Process प्रलेखन के अनुसार यहाँ (पायथन 2) या यहाँ (पायथन 3)


संबंधित सवाल
सबसे लोकप्रिय