คำถามติดแท็ก multiprocessing

การประมวลผลหลายขั้นตอนคือการใช้หน่วยประมวลผลกลาง (ซีพียู) สองหน่วยหรือมากกว่าภายในระบบคอมพิวเตอร์เครื่องเดียว รายละเอียดการใช้งานและการใช้งานที่เกี่ยวข้องแตกต่างกันไปตามระบบปฏิบัติการและภาษาโปรแกรม ดังนั้นควรเพิ่มแท็กสำหรับทั้ง OS และภาษาเมื่อใช้แท็กนี้

5
การประมวลผลหลายขั้นตอน: ฉันจะแบ่งปันคำสั่งระหว่างกระบวนการต่างๆได้อย่างไร
โปรแกรมที่สร้างกระบวนการต่างๆที่ทำงานบนคิวที่สามารถเข้าร่วมได้Qและในที่สุดอาจจัดการกับพจนานุกรมส่วนกลางDเพื่อจัดเก็บผลลัพธ์ (ดังนั้นแต่ละกระบวนการย่อยอาจใช้Dเพื่อเก็บผลลัพธ์และดูว่ากระบวนการย่อยอื่น ๆ กำลังสร้างผลลัพธ์อะไร) ถ้าฉันพิมพ์พจนานุกรม D ในกระบวนการย่อยฉันจะเห็นการปรับเปลี่ยนที่ได้ทำลงไปแล้ว (เช่นใน D) แต่หลังจากกระบวนการหลักเข้าร่วม Q ถ้าฉันพิมพ์ D มันเป็นคำสั่งเปล่า! ฉันเข้าใจว่าเป็นปัญหาการซิงโครไนซ์ / ล็อก ใครช่วยบอกทีว่าเกิดอะไรขึ้นที่นี่และฉันจะซิงโครไนซ์การเข้าถึง D ได้อย่างไร

5
ใช้อาร์เรย์ numpy ในหน่วยความจำแบบแบ่งใช้สำหรับการประมวลผลหลายขั้นตอน
ฉันต้องการใช้อาร์เรย์ numpy ในหน่วยความจำที่ใช้ร่วมกันเพื่อใช้กับโมดูลมัลติโปรเซสเซอร์ ความยากคือการใช้มันเหมือนกับอาร์เรย์ numpy ไม่ใช่แค่อาร์เรย์ ctypes from multiprocessing import Process, Array import scipy def f(a): a[0] = -a[0] if __name__ == '__main__': # Create the array N = int(10) unshared_arr = scipy.rand(N) arr = Array('d', unshared_arr) print "Originally, the first two elements of arr = %s"%(arr[:2]) # Create, start, …

6
วิธีการทำ .join () ของโมดูลมัลติโพรเซสเซอร์ของ Python คืออะไร
เรียนรู้เกี่ยวกับ Python Multiprocessing (จากบทความ PMOTW ) และชอบคำชี้แจงเกี่ยวกับjoin()วิธีการนี้ ในบทช่วยสอนเก่าตั้งแต่ปี 2008ระบุว่าหากไม่มีการp.join()เรียกในโค้ดด้านล่าง "กระบวนการย่อยจะไม่ได้ใช้งานและไม่ยุติกลายเป็นซอมบี้ที่คุณต้องฆ่าด้วยตนเอง" from multiprocessing import Process def say_hello(name='world'): print "Hello, %s" % name p = Process(target=say_hello) p.start() p.join() ฉันได้เพิ่มงานพิมพ์ของPIDa time.sleepเพื่อทดสอบและเท่าที่ฉันสามารถบอกได้กระบวนการนี้จะสิ้นสุดลงด้วยตัวเอง: from multiprocessing import Process import sys import time def say_hello(name='world'): print "Hello, %s" % name print 'Starting:', p.name, p.pid sys.stdout.flush() print 'Exiting …

8
Multiprocessing: ใช้ tqdm เพื่อแสดงแถบความคืบหน้า
เพื่อให้โค้ดของฉันเป็น "ไพโธนิก" มากขึ้นและเร็วขึ้นฉันใช้ "มัลติโพรเซสเซอร์" และฟังก์ชันแผนที่เพื่อส่ง a) ฟังก์ชันและ b) ช่วงของการทำซ้ำ โซลูชันที่ฝังไว้ (เช่นเรียก tqdm โดยตรงในช่วง tqdm.tqdm (ช่วง (0, 30)) ไม่ทำงานกับการประมวลผลหลายขั้นตอน (ตามสูตรในโค้ดด้านล่าง) แถบความคืบหน้าจะแสดงตั้งแต่ 0 ถึง 100% (เมื่อ python อ่านรหัส?) แต่ไม่ได้ระบุความคืบหน้าจริงของฟังก์ชันแผนที่ จะแสดงแถบความคืบหน้าเพื่อระบุขั้นตอนที่ฟังก์ชัน 'แผนที่' เป็นอย่างไร? from multiprocessing import Pool import tqdm import time def _foo(my_number): square = my_number * my_number time.sleep(1) return square if __name__ …

8
การประมวลผลหลายขั้นตอน: การแบ่งปันวัตถุอ่านอย่างเดียวขนาดใหญ่ระหว่างกระบวนการ?
กระบวนการย่อยเกิดขึ้นผ่านอ็อบเจ็กต์การแชร์แบบมัลติโพรเซสเซอร์ที่สร้างขึ้นก่อนหน้านี้ในโปรแกรมหรือไม่ ฉันมีการตั้งค่าต่อไปนี้: do_some_processing(filename): for line in file(filename): if line.split(',')[0] in big_lookup_object: # something here if __name__ == '__main__': big_lookup_object = marshal.load('file.bin') pool = Pool(processes=4) print pool.map(do_some_processing, glob.glob('*.data')) ฉันกำลังโหลดวัตถุขนาดใหญ่ลงในหน่วยความจำจากนั้นสร้างกลุ่มคนงานที่ต้องใช้ประโยชน์จากวัตถุขนาดใหญ่นั้น วัตถุขนาดใหญ่สามารถเข้าถึงได้แบบอ่านอย่างเดียวฉันไม่จำเป็นต้องผ่านการปรับเปลี่ยนระหว่างกระบวนการ คำถามของฉันคือ: วัตถุขนาดใหญ่ถูกโหลดลงในหน่วยความจำที่ใช้ร่วมกันหรือไม่เช่นเดียวกับที่ฉันสร้างกระบวนการใน unix / c หรือแต่ละกระบวนการโหลดสำเนาของวัตถุขนาดใหญ่ของตัวเองหรือไม่ อัปเดต: เพื่อชี้แจงเพิ่มเติม - big_lookup_object เป็นวัตถุการค้นหาที่ใช้ร่วมกัน ฉันไม่จำเป็นต้องแยกมันและประมวลผลแยกกัน ฉันต้องการเก็บสำเนาไว้หนึ่งชุด งานที่ฉันต้องแยกคือการอ่านไฟล์ขนาดใหญ่อื่น ๆ จำนวนมากและค้นหารายการในไฟล์ขนาดใหญ่เหล่านั้นเทียบกับวัตถุการค้นหา อัปเดตเพิ่มเติม: ฐานข้อมูลเป็นทางออกที่ดี memcached อาจเป็นทางออกที่ดีกว่าและไฟล์บนดิสก์ (Shelve …

8
Python Process Pool ไม่ใช่ daemonic?
เป็นไปได้ไหมที่จะสร้าง python Pool ที่ไม่ใช่ daemonic? ฉันต้องการสระว่ายน้ำที่สามารถเรียกใช้ฟังก์ชันที่มีสระว่ายน้ำอื่นอยู่ข้างในได้ ฉันต้องการสิ่งนี้เนื่องจากกระบวนการ deamon ไม่สามารถสร้างกระบวนการได้ โดยเฉพาะจะทำให้เกิดข้อผิดพลาด: AssertionError: daemonic processes are not allowed to have children ยกตัวอย่างเช่นพิจารณาสถานการณ์ที่function_aมีสระว่ายน้ำซึ่งวิ่งที่มีสระว่ายน้ำที่วิ่งfunction_b function_cห่วงโซ่ฟังก์ชันนี้จะล้มเหลวเนื่องจากfunction_bกำลังรันในกระบวนการ daemon และกระบวนการ daemon ไม่สามารถสร้างกระบวนการได้

9
แสดงความคืบหน้าของพูลการประมวลผลหลายตัวของ Python imap_unordered call?
ฉันมีสคริปต์ที่ประสบความสำเร็จในการทำชุดงานพูลหลายกระบวนการด้วยการimap_unordered()โทร: p = multiprocessing.Pool() rs = p.imap_unordered(do_work, xrange(num_tasks)) p.close() # No more work p.join() # Wait for completion อย่างไรก็ตามของฉันnum_tasksอยู่ที่ประมาณ 250,000 ดังนั้นการjoin()ล็อกเธรดหลักเป็นเวลา 10 วินาทีหรือมากกว่านั้นและฉันต้องการที่จะสามารถสะท้อนออกไปยังบรรทัดคำสั่งทีละน้อยเพื่อแสดงว่ากระบวนการหลักไม่ได้ถูกล็อค สิ่งที่ต้องการ: p = multiprocessing.Pool() rs = p.imap_unordered(do_work, xrange(num_tasks)) p.close() # No more work while (True): remaining = rs.tasks_remaining() # How many of the map call haven't been …

2
การแบ่งปันคิวผลลัพธ์ระหว่างกระบวนการต่างๆ
เอกสารสำหรับการแสดงโมดูลวิธีการส่งคิวให้กระบวนการที่เริ่มต้นด้วยmultiprocessing multiprocessing.Processแต่ฉันจะแชร์คิวกับกระบวนการของผู้ปฏิบัติงานแบบอะซิงโครนัสที่เริ่มต้นด้วยได้apply_asyncอย่างไร ฉันไม่ต้องการการเข้าร่วมแบบไดนามิกหรือสิ่งอื่นใดเป็นเพียงวิธีให้คนงาน (ซ้ำ ๆ ) รายงานผลกลับไปที่ฐาน import multiprocessing def worker(name, que): que.put("%d is done" % name) if __name__ == '__main__': pool = multiprocessing.Pool(processes=3) q = multiprocessing.Queue() workers = pool.apply_async(worker, (33, q)) สิ่งนี้ล้มเหลวด้วย: RuntimeError: Queue objects should only be shared between processes through inheritance. ฉันเข้าใจว่าสิ่งนี้หมายถึงอะไรและฉันเข้าใจคำแนะนำในการสืบทอดแทนที่จะต้องการการดอง / การไม่หยิบ (และข้อ จำกัด พิเศษทั้งหมดของ …

6
วิธีใช้คิวการประมวลผลหลายขั้นตอนใน Python
ฉันมีปัญหามากในการพยายามทำความเข้าใจว่าคิวการประมวลผลหลายตัวทำงานบน python อย่างไรและจะใช้งานอย่างไร สมมติว่าฉันมีโมดูล python สองโมดูลที่เข้าถึงข้อมูลจากไฟล์ที่แชร์ลองเรียกโมดูลทั้งสองนี้ว่าตัวเขียนและผู้อ่าน แผนของฉันคือให้ทั้งผู้อ่านและผู้เขียนใส่คำขอลงในคิวการประมวลผลหลายขั้นตอนแยกกันสองคิวจากนั้นให้กระบวนการที่สามแสดงคำขอเหล่านี้ในลูปและดำเนินการดังกล่าว ปัญหาหลักของฉันคือฉันไม่รู้วิธีใช้ multiprocessing.queue อย่างถูกต้องคุณไม่สามารถสร้างอินสแตนซ์ออบเจ็กต์สำหรับแต่ละกระบวนการได้เนื่องจากจะเป็นคิวแยกกันคุณจะแน่ใจได้อย่างไรว่ากระบวนการทั้งหมดเกี่ยวข้องกับคิวที่ใช้ร่วมกัน (หรือ ในกรณีนี้คือคิว)

5
ตัวอย่างง่ายๆของการใช้ Multiprocessing Queue, Pool และ Locking
ฉันพยายามอ่านเอกสารที่http://docs.python.org/dev/library/multiprocessing.htmlแต่ฉันยังคงดิ้นรนกับคิวการประมวลผลหลายขั้นตอนพูลและการล็อก และตอนนี้ฉันสามารถสร้างตัวอย่างด้านล่างได้ เกี่ยวกับคิวและพูลฉันไม่แน่ใจว่าฉันเข้าใจแนวคิดนี้ถูกต้องหรือไม่ดังนั้นโปรดแก้ไขฉันถ้าฉันผิด สิ่งที่ฉันพยายามบรรลุคือการดำเนินการ 2 คำขอในเวลา (รายการข้อมูลมี 8 ในตัวอย่างนี้) ฉันควรใช้อะไร พูลเพื่อสร้าง 2 กระบวนการที่สามารถจัดการคิวที่แตกต่างกันสองคิว (สูงสุด 2 คิว) หรือฉันควรใช้คิวเพื่อประมวลผลอินพุต 2 รายการในแต่ละครั้ง การล็อคจะเป็นการพิมพ์ผลลัพธ์อย่างถูกต้อง import multiprocessing import time data = (['a', '2'], ['b', '4'], ['c', '6'], ['d', '8'], ['e', '1'], ['f', '3'], ['g', '5'], ['h', '7'] ) def mp_handler(var1): for indata in var1: p …

6
แชร์อาร์เรย์ Numpy ขนาดใหญ่ที่อ่านอย่างเดียวระหว่างกระบวนการหลายกระบวนการ
ฉันมี SciPy Array (เมทริกซ์) 60GB ฉันต้องแชร์ระหว่างmultiprocessing Processวัตถุมากกว่า5 ชิ้น ฉันเคยเห็น numpy-sharedmem และอ่านการสนทนานี้ในรายการ SciPy ดูเหมือนจะมีสองวิธีคือnumpy-sharedmemใช้ a multiprocessing.RawArray()และแมป NumPy dtypes ถึงctypes ตอนนี้numpy-sharedmemดูเหมือนจะเป็นทางไป แต่ฉันยังไม่เห็นตัวอย่างอ้างอิงที่ดี ฉันไม่ต้องการการล็อกใด ๆ เนื่องจากอาร์เรย์ (จริงๆแล้วคือเมทริกซ์) จะเป็นแบบอ่านอย่างเดียว ตอนนี้เนื่องจากขนาดของมันฉันต้องการหลีกเลี่ยงการทำสำเนา มันเสียงเหมือนวิธีที่ถูกต้องคือการสร้างเพียงสำเนาของอาร์เรย์เป็นsharedmemอาร์เรย์แล้วส่งผ่านไปยังProcessวัตถุ? คำถามเฉพาะสองสามข้อ: อะไรคือวิธีที่ดีที่สุดในการส่งแฮนเดิลแชร์ไปยังProcess()รายการย่อย ฉันต้องการคิวเพื่อส่งอาร์เรย์หนึ่งรอบหรือไม่? ท่อจะดีกว่าไหม? ฉันสามารถส่งเป็นอาร์กิวเมนต์ไปยังProcess()init ของคลาสย่อยได้หรือไม่ (โดยที่ฉันสมมติว่ามันถูกดอง) ในการสนทนาที่ฉันเชื่อมโยงไว้ข้างต้นมีการระบุว่าnumpy-sharedmemไม่ปลอดภัย 64 บิต? ฉันกำลังใช้โครงสร้างบางอย่างที่ไม่สามารถระบุแอดเดรสแบบ 32 บิตได้ มีข้อแลกเปลี่ยนกับRawArray()แนวทางนี้หรือไม่? ช้ากว่า buggier? ฉันต้องการการแมป ctype-to-dtype สำหรับเมธอด numpy-sharedmem หรือไม่? ใครมีตัวอย่างโค้ด OpenSource …

1
ใช้ฟังก์ชันกับ DataFrame แพนด้าที่จัดกลุ่มแบบขนานอย่างมีประสิทธิภาพ
ฉันมักจะต้องใช้ฟังก์ชันกับกลุ่มที่มีขนาดใหญ่มากDataFrame(ของประเภทข้อมูลผสม) และต้องการใช้ประโยชน์จากหลายคอร์ ฉันสามารถสร้างตัววนซ้ำจากกลุ่มและใช้โมดูลการประมวลผลหลายขั้นตอน แต่ไม่มีประสิทธิภาพเนื่องจากทุกกลุ่มและผลลัพธ์ของฟังก์ชันจะต้องถูกดองสำหรับการส่งข้อความระหว่างกระบวนการ มีวิธีใดบ้างที่จะหลีกเลี่ยงการดองหรือหลีกเลี่ยงการคัดลอกโดยDataFrameสิ้นเชิง? ดูเหมือนว่าฟังก์ชันหน่วยความจำแบบแบ่งใช้ของโมดูลมัลติโพรเซสซิ่งจะถูก จำกัด ไว้ที่numpyอาร์เรย์ มีทางเลือกอื่นอีกไหม?

4
วิธีแก้ปัญหา“ AttributeError: __exit__” ในการเล่นหลายส่วนใน Python
ฉันพยายามเขียนโค้ดการอ่าน csv ใหม่เพื่อให้สามารถรันบนหลายคอร์ใน Python 3.2.2 ฉันพยายามใช้Poolวัตถุของการประมวลผลหลายขั้นตอนซึ่งฉันดัดแปลงมาจากตัวอย่างการทำงาน (และได้ผลสำหรับฉันในส่วนอื่นของโครงการแล้ว) ฉันพบข้อความแสดงข้อผิดพลาดซึ่งพบว่ายากที่จะถอดรหัสและแก้ไขปัญหา ข้อผิดพลาด: Traceback (most recent call last): File "parser5_nodots_parallel.py", line 256, in <module> MG,ppl = csv2graph(r) File "parser5_nodots_parallel.py", line 245, in csv2graph node_chunks) File "/Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/multiprocessing/pool.py", line 251, in map return self.map_async(func, iterable, chunksize).get() File "/Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/multiprocessing/pool.py", line 552, in get raise self._value AttributeError: __exit__ …
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.