php กระทู้สนทนาที่ทำอะไรไม่ถูก การคำนวณแบบมัลติเธรดใน PHP: pthreads การเรียกใช้สคริปต์หลายชุด - หนึ่งชุดต่อการดำเนินการ

บางครั้งจำเป็นต้องดำเนินการหลายอย่างพร้อมกัน เช่น ตรวจสอบการเปลี่ยนแปลงในตารางฐานข้อมูลหนึ่ง และทำการแก้ไขตารางฐานข้อมูลอื่น นอกจากนี้ หากการดำเนินการอย่างใดอย่างหนึ่ง (เช่น การตรวจสอบการเปลี่ยนแปลง) ใช้เวลานาน เห็นได้ชัดว่าการดำเนินการตามลำดับจะไม่รับประกันความสมดุลของทรัพยากร

เพื่อแก้ไขปัญหาประเภทนี้ การเขียนโปรแกรมใช้มัลติเธรด - แต่ละการดำเนินการจะถูกวางไว้ในเธรดที่แยกจากกันพร้อมจำนวนทรัพยากรที่จัดสรรและทำงานภายในนั้น ด้วยวิธีนี้ งานทั้งหมดจะเสร็จสิ้นแยกกันและเป็นอิสระ

แม้ว่า PHP จะไม่รองรับการทำงานแบบมัลติเธรด แต่ก็มีหลายวิธีในการจำลอง ซึ่งจะกล่าวถึงด้านล่างนี้

1. การเรียกใช้สคริปต์หลายชุด - หนึ่งชุดต่อการดำเนินการ

//woman.php if (!isset($_GET["thread"])) ( system("wget ​​​​http://localhost/woman.php?thread=make_me_happy"); system("wget ​​​​http: //localhost/ woman.php?thread=make_me_rich"); ) elseif ($_GET["thread"] == "make_me_happy") ( make_her_happy(); ) elseif ($_GET["thread"] == "make_me_rich" ) ( find_another_one( ; )

เมื่อเรารันสคริปต์นี้โดยไม่มีพารามิเตอร์ มันจะรันสำเนาของตัวเองสองชุดโดยอัตโนมัติ พร้อมด้วย ID การดำเนินการ ("thread=make_me_happy" และ "thread=make_me_rich") ซึ่งจะเริ่มต้นการดำเนินการของฟังก์ชันที่จำเป็น

วิธีนี้ทำให้เราบรรลุผลตามที่ต้องการ - ดำเนินการสองครั้งพร้อมกัน - แต่แน่นอนว่านี่ไม่ใช่การทำงานแบบมัลติเธรด แต่เป็นเพียงไม้ค้ำยันสำหรับการทำงานพร้อมกัน

2. เส้นทางของเจได - ใช้ส่วนขยาย PCNTL

PCNTL เป็นส่วนขยายที่ช่วยให้คุณทำงานกับกระบวนการต่างๆ ได้อย่างเต็มที่ นอกจากการจัดการแล้ว ยังรองรับการส่งข้อความ ตรวจสอบสถานะ และกำหนดลำดับความสำคัญอีกด้วย นี่คือลักษณะของสคริปต์ก่อนหน้าที่ใช้ PCNTL:

$pid = pcntl_fork(); if ($pid == 0) ( make_her_happy(); ) elseif ($pid > 0) ( $pid2 = pcntl_fork(); if ($pid2 == 0) ( find_another_one(); ) )

มันดูค่อนข้างสับสน มาดูทีละบรรทัดกันดีกว่า

ในบรรทัดแรกเรา "แยก" กระบวนการปัจจุบัน (ทางแยกกำลังคัดลอกกระบวนการในขณะที่รักษาค่าของตัวแปรทั้งหมด) โดยแบ่งออกเป็นสองกระบวนการ (ปัจจุบันและลูก) ทำงานแบบขนาน

เพื่อให้เข้าใจว่าขณะนี้เราอยู่ในกระบวนการเด็กหรือกระบวนการแม่ ฟังก์ชัน pcntl_fork จะส่งคืน 0 สำหรับเด็กและ ID กระบวนการสำหรับมารดา ดังนั้นในบรรทัดที่สอง เราดูที่ $pid ถ้าเป็นศูนย์ แสดงว่าเราอยู่ในกระบวนการลูก - เรากำลังดำเนินการฟังก์ชัน ไม่เช่นนั้นเราจะอยู่ในแม่ (บรรทัดที่ 4) จากนั้นเราจะสร้างกระบวนการอื่นและ ปฏิบัติภารกิจเช่นเดียวกัน

กระบวนการดำเนินการสคริปต์:

ดังนั้นสคริปต์จึงสร้างกระบวนการย่อยอีก 2 กระบวนการซึ่งเป็นสำเนาและมีตัวแปรเดียวกันที่มีค่าใกล้เคียงกัน และการใช้ตัวระบุที่ส่งคืนโดยฟังก์ชัน pcntl_fork เราจะค้นหาว่าขณะนี้เราอยู่ในเธรดใดและดำเนินการตามที่จำเป็น

แม่ของเพื่อนที่ดีของฉันทำกระเป๋าเดินทางหายในเที่ยวบินจากเซนต์ปีเตอร์สเบิร์กไปมอสโก และเธอต้องบินต่อไปยังชายฝั่งที่อบอุ่นกว่า และตอนนี้เธออยู่ที่รีสอร์ทแล้ว - ไม่มีชุดว่ายน้ำ รองเท้าแตะ และมีเพียง T -เสื้อเชิ้ตจากกระเป๋าถือของเธอ เพื่อประโยชน์ในสมัยก่อน ฉันให้คำแนะนำแก่เธอสองสามข้อว่าต้องทำอะไรและควรวิ่งที่ไหน และวันนี้ฉันตัดสินใจเขียนทุกสิ่งที่ฉันรู้ในหัวข้อที่กำหนดที่นี่

เพื่ออธิบายว่าฉันฉลาดตรงไหน ฉันขอเตือนคุณว่าครั้งหนึ่งฉันเคยทำงานบริการภาคพื้นดินให้กับสายการบินหลายสาย รวมถึงการจัดการกับปัญหาบางอย่างที่เกี่ยวข้องกับการค้นหากระเป๋าเดินทางด้วย แน่นอนว่าบวกกับประสบการณ์การบินของตัวเองด้วย แต่เนื่องจาก ฉันออกจากอุตสาหกรรมการบริการการบินเมื่อหลายปีก่อน บางทีความแตกต่างบางอย่างอาจมีการเปลี่ยนแปลง - หากเป็นเช่นนั้น ฉันจะยอมรับความคิดเห็นในหัวข้อนี้อย่างสุดซึ้งและแก้ไขข้อมูลในโพสต์

ฉันจะเริ่มต้นด้วยสิ่งนี้ สิ่งที่คุณต้องทำเพื่อป้องกันไม่ให้กระเป๋าเดินทางของคุณสูญหาย:
1. ฉีกแท็กและสติกเกอร์ทั้งหมดจากการเดินทางครั้งก่อนออกจากกระเป๋าเดินทางของคุณ แม้แต่ชิ้นเล็กๆ ที่มีบาร์โค้ด ซึ่งมักจะติดกาวแยกไว้กับกระเป๋าเดินทาง สิ่งเหล่านี้อาจทำให้ระบบสแกนและคัดแยกสัมภาระอัตโนมัติสับสนได้
2. แขวนป้ายชื่อบนกระเป๋าเดินทางของคุณ (กระเป๋า กล่อง พัสดุ - โดยทั่วไป ทุกอย่างที่คุณเช็คอินเป็นกระเป๋าเดินทาง): คุณสามารถซื้อตัวเลือกที่นำมาใช้ซ้ำได้ล่วงหน้าหรือนำแท็กกระดาษไปที่เคาน์เตอร์เช็คอิน - โดยปกติทั้งหมด สายการบินที่มีคุณภาพครึ่งหนึ่งแจกให้โดยไม่มีข้อจำกัด ตัวอย่างเช่น สายการบินเอมิเรตส์มักมีแท็กพลาสติกที่ดีเยี่ยมบนสายไฟที่ทนทานซึ่งมีอายุการใช้งานยาวนานมาก:

คนหวาดระแวงเก่าๆ ก็ทำเหมือนฉันได้: ฉันมักจะมีแท็กพลาสติกแบบใช้ซ้ำได้จากชุด Samsonite แขวนอยู่บนกระเป๋าเดินทางของฉันซึ่งมีที่อยู่ถาวร หมายเลขโทรศัพท์ และอีเมล และเมื่อฉันบินไปที่ไหนสักแห่งในช่วงวันหยุด ฉันจะแขวนกระดาษใบหนึ่งไว้ด้วย ระบุวันที่ที่ฉันเข้าพักในสถานที่ใหม่และผู้ติดต่อที่เป็นไปได้ทั้งหมด (ชื่อและที่อยู่ของโรงแรม หมายเลขโทรศัพท์ท้องถิ่น หากมี และชื่อและนามสกุลของคุณแน่นอน)
3. ที่เคาน์เตอร์เช็คอิน ตรวจสอบให้แน่ใจว่าป้ายสัมภาระที่พิมพ์โดยตัวแทนเช็คอินติดอยู่กับกระเป๋าเดินทางของคุณ พร้อมด้วยรหัสเมืองที่คุณจะบินและหมายเลขเที่ยวบิน
4. หากคุณมีเที่ยวบินต่อเครื่องหลายเที่ยวบิน ให้แจ้งตัวแทนเช็คอินเกี่ยวกับเรื่องนี้และระบุว่าคุณต้องการเช็คอินสัมภาระที่จุดใด ในบางกรณี จะต้องรับสัมภาระที่สนามบินแห่งใดแห่งหนึ่งตลอดเส้นทาง ไม่ว่าคุณจะต้องการอะไร: สิ่งนี้ใช้กับการถ่ายโอนระหว่างสนามบิน (Orly และ Charles de Gaulle ในปารีส, Domodedovo - Sheremetyevo - "Vnukovo " ในมอสโก) อาคารผู้โดยสารแยกต่างหาก (อาคารผู้โดยสาร 1 และ 2 ในแฟรงก์เฟิร์ต) หรือที่จุดแรกที่เดินทางมาถึงสหรัฐอเมริกาหรือเม็กซิโก - นี่เป็นข้อกำหนดด้านศุลกากรในประเทศเหล่านี้: สมมติว่าคุณกำลังบินมอสโก - วอชิงตัน - ฟีนิกซ์ป้ายสัมภาระ ออกให้ทั้งสามส่วนไปยังฟีนิกซ์ แต่ในวอชิงตัน สัมภาระจะต้องถูกหยิบขึ้นมา ผ่านด่านศุลกากร และเช็คอินอีกครั้ง นอกจากนี้ หากคุณกำลังเช็คอินรถเข็นเด็กที่คุณได้รับอนุญาตให้นำขึ้นเครื่องก่อนขึ้นเครื่อง เครื่องบินหรือสัตว์ คุณอาจต้องไปรับที่จุดต่อเครื่อง โดยทั่วไปในกรณีของเส้นทางที่ซับซ้อนและมีการเปลี่ยนเครื่อง ควรชี้แจงรายละเอียดการเคลื่อนย้ายสัมภาระล่วงหน้าที่คอลเซ็นเตอร์ของสายการบินหรือในกรณีที่รุนแรงเมื่อเช็คอินจะดีกว่า
5. ทำให้กระเป๋าเดินทางของคุณมองเห็นได้: ความล่าช้าของสัมภาระไม่ใช่ความผิดของผู้จัดการสัมภาระหรือความล้มเหลวในระบบคัดแยกเสมอไป บางครั้งผู้โดยสารที่เหม่อลอยอีกคนที่เหนื่อยล้าหลังจากเที่ยวบินอันยาวนานจะนำกระเป๋า Samsonite สีดำหรือกระเป๋ากีฬาธรรมดาใบเดียวกับของคุณออกจากเข็มขัดกระเป๋า ดังนั้นให้ทำเครื่องหมายกระเป๋าของคุณ: แขวนริบบิ้นสีสดใสหรือของเล่นนุ่ม ๆ ไว้บนที่จับติดสติกเกอร์ขนาดใหญ่หรือเพียงแค่เลือกกระเป๋าเดินทางด้วยสีที่ผิดปกติ

อะไรที่ไม่ควรโหลดในกระเป๋าเดินทาง?
โปรดจำไว้ว่าสายการบินและสนามบินทุกแห่งจะสูญเสียสัมภาระ แน่นอนว่าสถิติสำหรับทุกคนนั้นแตกต่างกัน แต่แม้แต่สายการบินที่น่าเชื่อถือที่สุดก็อาจทำให้สัมภาระสูญหายหรือล่าช้าได้ และแม้แต่ในสนามบินที่เล็กที่สุดซึ่งผู้จัดการสัมภาระเพียงคนเดียวจะขนส่งรถเข็นพร้อมกระเป๋าเดินทางโดยตรงจากเคาน์เตอร์เช็คอินไปยังเครื่องบิน ดังนั้นฉันขอแนะนำให้คุณนำกระเป๋าถือติดตัวไปด้วยเสมอ:
- เอกสารสำคัญ รวมถึงเอกสารที่ไม่จำเป็นในระหว่างเที่ยวบิน (เช่น ในการเดินทางไปเซนต์ปีเตอร์สเบิร์กครั้งล่าสุด ฉันต้องเปลี่ยนใบอนุญาต และฉันก็นำทะเบียนสมรสและบัตรทุกประเภทจากกระเป๋าถือติดตัวไปด้วย โรงเรียนสอนขับรถ)
- กุญแจ (เมื่อใช้ร่วมกับแท็กที่อยู่ของคุณ อาจเป็นอันตรายได้)
- เงิน เครื่องประดับ (ไม่มีความเห็น)
- อุปกรณ์เปราะบางราคาแพง
- ยาที่คุณใช้เป็นประจำตามจำนวนที่จำเป็นสำหรับเที่ยวบิน และสำรองไว้เล็กน้อยในกรณีที่คุณต้องมองหายาอะนาล็อกในต่างประเทศหรือเมือง ยาที่ต้องสั่งโดยแพทย์ที่ไม่สามารถซื้อได้หากกระเป๋าเดินทางของคุณสูญหาย ให้นำติดตัวไปด้วยตามจำนวนที่จำเป็นสำหรับการเดินทางทั้งหมด
- สิ่งที่คุณอาจต้องการอย่างเร่งด่วนเมื่อมาถึง (เช่น ที่ชาร์จโทรศัพท์
- สิ่งที่มีคุณค่าทางจิตใจสำหรับคุณเป็นการส่วนตัว: บางครั้งกระเป๋าเดินทางก็สูญหายไปตลอดกาล และหากการทำไดอารี่ส่วนตัวหายทำให้หัวใจสลาย ก็ควรทิ้งไว้ที่บ้านหรือนำติดตัวไปบนเครื่องบินจะดีกว่า

เรื่องราวที่ให้ความรู้: ระหว่างที่ฉันทำงานที่ Lufthansa ในเซนต์ปีเตอร์สเบิร์ก สามีภรรยาคู่หนึ่งจากสหรัฐอเมริกาวิ่งมาที่สำนักงานของเรา บีบมือ - กระเป๋าเดินทางของพวกเขาซึ่งมีเอกสารสำคัญมากสำหรับการพิจารณารับเลี้ยงบุตรบุญธรรมยังมาไม่ถึง การพิจารณาคดีคือ วันรุ่งขึ้น แน่นอนว่าสายการบินต้องตำหนิการสูญหายของสัมภาระ แต่ใครจะได้ประโยชน์จากเรื่องนี้? เพื่อหลีกเลี่ยงสถานการณ์ดังกล่าว เพียงแค่ใส่เอกสารสำคัญในกระเป๋าถือของคุณก็เพียงพอแล้ว

มาถึงแล้วไม่พบสัมภาระบนสายพานสัมภาระ จะทำอย่างไร?
1. หากคุณเช็คอินสัมภาระของคุณนอกเหนือจากกระเป๋าเดินทางทั่วไป: สกี เชลโล แผงพลาสมาขนาดติดผนัง รถเข็นเด็ก หินอ่อน Great Dane ที่มีชีวิต ให้ตรวจสอบว่ามีจุดแยกต่างหากสำหรับการออกสิ่งที่เรียกว่าหรือไม่ กระเป๋าเดินทางขนาดใหญ่หรือสัมภาระขนาดใหญ่ - กระเป๋าเดินทางที่คล้ายกับที่ฉันอธิบายไว้ข้างต้นมักจะถูกโหลดลงในช่องแยกต่างหากและขนถ่ายแยกต่างหากด้วยตนเอง หากไม่พบกระเป๋าเดินทางของคุณที่นั่นเช่นกัน
2. ไปที่จุดติดตามสัมภาระหรือเคาน์เตอร์ Lost & Found ที่นั่น คุณจะต้องกรอกแบบฟอร์มพิเศษพร้อมข้อมูลโดยละเอียดเกี่ยวกับกระเป๋าเดินทางของคุณ: เส้นทาง ลักษณะที่ปรากฏ รายการเนื้อหาโดยย่อ รายชื่อติดต่อของคุณ ณ สถานที่พำนักถาวร และการพำนักชั่วคราว นอกจากนี้ ในบริการติดตามสัมภาระ คุณมีแนวโน้มที่จะเห็นแผนภูมิสัมภาระในลักษณะนี้:

ตามการจำแนกประเภทนี้ กระเป๋าเดินทางที่หายไปของคุณจะถูกเข้ารหัส ดังนั้นคุณจึงเข้าใจว่า กระเป๋าเดินทางทั้งสองใบนี้จะถูกเข้ารหัสเหมือนกัน:

ดังนั้นคุณสามารถเพิ่มรายละเอียดเพิ่มเติมในคำอธิบายได้ตามต้องการ และอย่าข้ามส่วนคำสั่งของเนื้อหา ตามกฎแล้ว เมื่อคุณกรอกรายงานความล่าช้าของสัมภาระเป็นครั้งแรก คุณจะถูกขอให้ระบุสิ่งของต่างๆ ที่สามารถระบุกระเป๋าของคุณสามารถระบุได้ หากไม่มีเครื่องหมายระบุที่ด้านนอก และจะต้องเปิดกระเป๋า (หาก เมื่อเปิดกระเป๋าแล้วคุณจะแจ้งเตือนเรื่องนี้) ตัวอย่างที่ไม่ดี: เสื้อยืด / หนังสือ / ผ้าเช็ดทำความสะอาดแบบเปียก ตัวอย่างที่ดี: บิกินี่สีแดงสด / แคตตาล็อกผลิตภัณฑ์จาก Malevich / เหล็กพับ หลังจากกรอกใบสมัครแล้ว พนักงานบริการติดตามสัมภาระจะให้หมายเลขในรูปแบบ XXXYY11111 แก่คุณ โดยที่ XXX คือรหัสสนามบินขาเข้า YY คือรหัสสายการบินขาเข้า + หมายเลขซีเรียลของใบสมัคร 5 หลัก เช่น JFKLH12345 หาก คุณบินกับลุฟท์ฮันซ่าไปยังสนามบินเคนเนดีในนิวยอร์ก จำหรือจดหมายเลขนี้ไว้ - มันจะเป็นวิธีที่ง่ายที่สุดในการค้นหาใบสมัครของคุณในใบสมัครในอนาคต
โดยใช้หมายเลขเดียวกันคุณสามารถตรวจสอบสถานะการค้นหาได้ด้วยตัวเอง (ด้วยเหตุผลบางประการ ลิงก์จะหายไป: หากไม่ได้ผลสำหรับคุณ Google World Tracer Online และลิงก์ที่สองอย่างแท้จริง - โดยมีหัวข้อ Baggage Tracing บนเว็บไซต์ worldtracer.aero - คือสิ่งที่คุณต้องการ) เพราะการผ่านไปสู่การสูญหาย&พบ มักจะเป็นเรื่องยากมาก
3. ลองติดต่อสำนักงานของสายการบินของคุณที่สนามบินปลายทาง: บางครั้ง (ขอย้ำ - SOMETIMES!) หากคุณไม่ได้บินกลับบ้าน แต่ไปที่สถานที่พำนักชั่วคราว (วันหยุด, การเดินทางเพื่อธุรกิจ) สายการบินสามารถจัดเตรียมชุดได้ ของใช้ในห้องน้ำ (ลุฟท์ฮันซ่ามีเสื้อยืดตัวใหญ่ แปรงสีฟันและยาสีฟัน หวี แชมพูและเจลอาบน้ำห่อเล็ก ผงซักฟอก 1 ห่อ ฯลฯ) หรือชำระเงินสดเล็กน้อยสำหรับค่าใช้จ่ายเล็กน้อย ณ จุดนั้น (ชำระเงินสดทันที)

จะเกิดอะไรขึ้นต่อไป?
ไฟล์ของคุณ (ที่เรียกว่า AHL) จะไปที่ระบบค้นหาสัมภาระส่วนกลาง (World Tracer) สัมภาระที่ไม่ได้รับสิทธิ์ทั้งหมดจะอยู่ในระบบการค้นหาเดียวกัน ไม่ว่าจะพบสัมภาระเหล่านั้นโดยไม่มีแท็กตามซอกมุมของลานเก็บสัมภาระหรือยังคงอยู่ในเข็มขัดสัมภาระก็ตาม สำหรับแต่ละรายการเหล่านี้ ไฟล์ในรูปแบบ XXXYY11111 จะเป็น สร้างขึ้นด้วยประเภทย่อยที่แตกต่างกันเท่านั้น - ที่เรียกว่า รายงานคงเหลือหรือ OHD หากข้อมูลจากไฟล์ AHL และ OHD ตรงกัน (นามสกุล คำอธิบายกระเป๋าเดินทาง เส้นทาง ฯลฯ) ทั้งสองสถานี (ที่มีการรายงานสัมภาระสูญหายและพบสัมภาระที่ไม่มีการอ้างสิทธิ์) จะได้รับการแจ้งเตือน จากนั้น มันเป็นเรื่องของเทคโนโลยี: การตรวจสอบอีกครั้ง และในกรณีที่ประสบความสำเร็จในการส่งต่อสัมภาระไปยังเมืองที่ต้องการ แน่นอนว่ายังมีงานที่ต้องทำด้วยมืออีกมาก เช่น การแลกเปลี่ยนข้อความ การปฏิเสธกระเป๋าเดินทางที่คล้ายกันแต่ไม่เหมือนกัน รวมถึงการตอบรับโทรศัพท์หลายสาย โดยทั่วไปแล้ว พนักงานบริการติดตามสัมภาระไม่เคยเบื่อเลย
สถิติโดยประมาณ: พบสัมภาระที่สูญหายมากกว่า 90% ใน 3 วันแรกของการค้นหา และ 3% สูญหายตลอดไป
คุณทำอะไรได้บ้าง?
1. หากคุณต้องซื้อสิ่งของที่จำเป็นเร่งด่วนเมื่อเดินทางมาถึง (ตั้งแต่แปรงสีฟันไปจนถึงชุดสูททำงาน) อย่าลืมเก็บใบเสร็จรับเงินไว้เพื่อชดเชยในภายหลัง อย่างไรก็ตาม คุณควรหลีกเลี่ยงการซื้อของราคาแพงโดยไม่จำเป็น ฉันจะอธิบายว่าทำไมในภายหลัง
2. ทำตามขั้นตอนใหม่ โดยจัดทำรายการเนื้อหาที่มีรายละเอียดมากที่สุด โดยควรระบุสี ยี่ห้อ และราคาโดยประมาณของแต่ละรายการ โดยควรเป็นภาษาอังกฤษ (ไม่เช่นนั้นพนักงานสายการบินจะต้องแปลรายการนี้เพื่อเข้าสู่ระบบ) ติดต่อเจ้าหน้าที่ สายการบินและส่ง พวกเขาได้รับรายการนี้และจะถูกเพิ่มลงในแอปพลิเคชันค้นหาสัมภาระ ในช่วง 5 วันแรก การค้นหากระเป๋าเดินทางจะดำเนินการที่สนามบินปลายทาง จากนั้นการค้นหาจะกลายเป็นความรับผิดชอบของสายการบินผู้ให้บริการ (สายการบินที่ระบุในหมายเลขใบสมัคร - จำ JFKLH12345 ได้ไหม) และหลังจาก 21 วันคุณ สามารถขอเงินชดเชยงวดสุดท้ายได้
3. หากไม่พบสัมภาระที่สูญหายหลังจากผ่านไป 21 วัน นับจากวันที่ยื่นคำชี้แจงเกี่ยวกับสัมภาระที่สูญหาย โปรดติดต่อสายการบินของผู้ให้บริการเพื่อเรียกร้องค่าชดเชย ถ้าจำไม่ผิดอายุความคือ 2 ปี คือ คุณสามารถขอรับค่าสินไหมทดแทนได้ภายในสองปีนับแต่วันที่ยื่นคำเรียกร้องค่าสินไหมทดแทน

การจ่ายเงินชดเชย
ในการชำระค่าชดเชย คุณจะต้องติดต่อสำนักงานตัวแทนของสายการบินของคุณพร้อมใบสมัครสำหรับการชำระเงิน เอกสารยืนยันเที่ยวบินและข้อเท็จจริงของการสูญหายของสัมภาระ (บัตรผ่านขึ้นเครื่อง ป้ายสัมภาระ หมายเลขเคลมสัมภาระสูญหาย รายละเอียดการชำระเงิน) หากฉันจำไม่ผิด ในสหพันธรัฐรัสเซีย การตัดสินใจเรื่องการชดเชยจะต้องได้รับการพิจารณาตามกฎหมายภายใน 30 วัน คุณอาจถูกขอให้ประเมินราคาของสิ่งของที่อยู่ภายใน และหากเป็นไปได้ ให้จัดเตรียมใบเสร็จรับเงินสำหรับการซื้อกระเป๋าเดินทางและสิ่งของในนั้น (ฉันเข้าใจว่าสิ่งนี้ไม่สมจริงในกรณีส่วนใหญ่ แต่นี่เป็นส่วนหนึ่งของขั้นตอน)
ก่อนหน้านี้ การชำระเงินจะคิดตามน้ำหนักของสัมภาระเช็คอิน ประมาณ 20 เหรียญสหรัฐฯ ต่อกิโลกรัม ต่อมาระบบการชำระเงินมีการเปลี่ยนแปลงและความรับผิดของสายการบินถูกจำกัดไว้ที่ 1,000 หน่วยทั่วไป (ต้นทุนของหน่วยทั่วไปคำนวณภายในสายการบิน) ซึ่งตอนที่ทำงานของฉันมีมูลค่าประมาณ 1,300 ยูโร เหล่านั้น. แม้ว่าคุณจะนำใบเสร็จรับเงินสำหรับการซื้อกระเป๋าเดินทาง Louis Vuitton ที่ทำจากหนังตุ๊กแกโบลิเวียพันตัวและอัดแน่นไปด้วยเพชร คุณจะไม่ได้รับมากกว่า 1,300 ยูโร

ดูเหมือนว่านักพัฒนา PHP ไม่ค่อยใช้การทำงานพร้อมกัน ฉันจะไม่พูดถึงความเรียบง่ายของโค้ดซิงโครนัส แน่นอนว่าการเขียนโปรแกรมแบบเธรดเดียวนั้นง่ายกว่าและชัดเจนกว่า แต่บางครั้งการใช้ความขนานเพียงเล็กน้อยอาจทำให้ประสิทธิภาพเพิ่มขึ้นอย่างเห็นได้ชัด

ในบทความนี้ เราจะมาดูกันว่า PHP สามารถทำมัลติเธรดได้อย่างไรโดยใช้ส่วนขยาย pthreads สิ่งนี้จะต้องติดตั้ง PHP 7.x เวอร์ชัน ZTS (Zend Thread Safety) พร้อมกับติดตั้งส่วนขยาย pthreads v3 (ในขณะที่เขียนนี้ ใน PHP 7.1 ผู้ใช้จะต้องติดตั้งจากสาขาหลักในพื้นที่เก็บข้อมูล pthreads - ดูส่วนขยายของบุคคลที่สาม)

คำอธิบายเล็กๆ น้อยๆ: pthreads v2 มีไว้สำหรับ PHP 5.x และไม่รองรับอีกต่อไป pthreads v3 มีไว้สำหรับ PHP 7.x และกำลังได้รับการพัฒนาอย่างแข็งขัน

หลังจากการพูดนอกเรื่องดังกล่าว เรามาดูตรงประเด็นกันดีกว่า!

การประมวลผลงานที่ทำครั้งเดียว

บางครั้งคุณต้องการประมวลผลงานครั้งเดียวในลักษณะแบบมัลติเธรด (ตัวอย่างเช่น การดำเนินการงาน I/O-bound บางอย่าง) ในกรณีเช่นนี้ คุณสามารถใช้คลาส Thread เพื่อสร้างเธรดใหม่และรันการประมวลผลบางอย่างบนเธรดที่แยกจากกัน

ตัวอย่างเช่น:

$task = คลาสใหม่ขยายเธรด ( $response ส่วนตัว; ฟังก์ชั่นสาธารณะ run() ( $content = file_get_contents("http://google.com"); preg_match("~ (.+)~", $content, $matches); $this->response = $matches; ) ); $task->start() && $task->join(); var_dump($task->response); // string (6) "กูเกิล"

วิธีการรันคือการประมวลผลของเรา ซึ่งจะดำเนินการภายในเธรดใหม่ เมื่อ Thread::start ถูกเรียก เธรดใหม่จะถูกสร้างขึ้น และเรียกใช้เมธอด run จากนั้นเราจะรวมเธรดย่อยกลับไปที่เธรดหลักโดยการเรียก Thread::join ซึ่งจะบล็อกจนกว่าเธรดย่อยจะดำเนินการเสร็จสิ้น เพื่อให้แน่ใจว่างานเสร็จสิ้นก่อนที่เราจะพยายามพิมพ์ผลลัพธ์ (ซึ่งถูกเก็บไว้ใน $task->response)

อาจไม่เป็นที่พึงปรารถนาที่จะสร้างมลพิษให้กับคลาสที่มีความรับผิดชอบเพิ่มเติมที่เกี่ยวข้องกับตรรกะของโฟลว์ (รวมถึงความรับผิดชอบในการกำหนดวิธีการรัน) เราสามารถแยกแยะคลาสดังกล่าวได้โดยการสืบทอดคลาสเหล่านั้นจากคลาส Threaded จากนั้นจึงสามารถรันภายในเธรดอื่นได้:

งานของชั้นเรียนขยาย Threaded ( public $response; public function someWork() ( $content = file_get_contents("http://google.com"); preg_match("~ (.+) ~", $content, $matches); $ นี้ -> ตอบกลับ = $matches; ) ) $task = งานใหม่; $thread = new class($task) ขยาย Thread ( private $task; public function __construct(Threaded $task) ( $this->task = $task; ) public function run() ( $this->task->someWork( ); ) ); $thread->start() && $thread->join(); var_dump($งาน -> ตอบกลับ);

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

มาดูลำดับชั้นของคลาสที่นำเสนอโดยส่วนขยาย pthreads:

เธรด (ใช้งาน Traversable, Collectable) Thread Worker Volatile Pool

เราได้ครอบคลุมและเรียนรู้พื้นฐานของคลาส Thread และ Threaded แล้ว ตอนนี้เรามาดูคลาสอื่นๆ อีกสามคลาสกัน (Worker, Volatile และ Pool)

การใช้เธรดซ้ำ

การเริ่มเธรดใหม่สำหรับแต่ละงานที่จำเป็นต้องทำแบบขนานนั้นมีราคาค่อนข้างแพง นี่เป็นเพราะว่าสถาปัตยกรรมที่ไม่มีสิ่งใดทั่วไปจะต้องถูกนำมาใช้ใน pthreads เพื่อให้เกิดการทำงานแบบมัลติเธรดภายใน PHP ซึ่งหมายความว่าจะต้องคัดลอกบริบทการดำเนินการทั้งหมดของอินสแตนซ์ปัจจุบันของล่าม PHP (รวมถึงทุกคลาส อินเทอร์เฟซ ลักษณะ และฟังก์ชัน) สำหรับแต่ละเธรดที่สร้างขึ้น เนื่องจากสิ่งนี้มีผลกระทบต่อประสิทธิภาพที่เห็นได้ชัดเจน สตรีมจึงควรถูกนำมาใช้ซ้ำทุกครั้งที่เป็นไปได้ เธรดสามารถนำมาใช้ซ้ำได้สองวิธี: การใช้ Workers หรือการใช้ Pools

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

นี่เป็นตัวอย่างเล็กๆ น้อยๆ:

งานของคลาสขยายเธรด ( private $value; public function __construct(int $i) ( $this->value = $i; ) public function run() ( usleep(250000); echo "Task: ($this->value) \n"; ) ) $worker = คนงานใหม่(); $คนงาน->เริ่มต้น(); สำหรับ ($i = 0; $i stack(new Task($i)); ) ในขณะที่ ($worker->collect()); $คนงาน->ปิดเครื่อง();

ในตัวอย่างด้านบน งาน 15 งานสำหรับอ็อบเจ็กต์ $worker ใหม่จะถูกพุชลงบนสแต็กโดยใช้เมธอด Worker::stack จากนั้นงานเหล่านั้นจะถูกประมวลผลตามลำดับที่ถูกพุช วิธีการ Worker::collect ดังที่แสดงไว้ด้านบน ใช้เพื่อล้างข้อมูลงานเมื่อดำเนินการเสร็จแล้ว ด้วยการใช้มัน ภายใน while loop เราจะบล็อกเธรดหลักจนกว่างานทั้งหมดในสแต็กจะเสร็จสิ้นและเคลียร์ - ก่อนที่เราจะเรียก Worker::shutdown การเลิกจ้างพนักงานก่อนกำหนด (เช่น ในขณะที่ยังมีงานที่ต้องทำให้เสร็จ) จะยังคงบล็อกเธรดหลักจนกว่างานทั้งหมดจะเสร็จสิ้นการดำเนินการ เพียงแต่ว่างานจะไม่ถูกรวบรวมขยะ (ซึ่งแสดงถึงหน่วยความจำรั่ว)

คลาส Worker จัดเตรียมวิธีการอื่นๆ หลายวิธีที่เกี่ยวข้องกับสแต็กงาน รวมถึง Worker::unstack เพื่อลบงานที่ซ้อนกันล่าสุด และ Worker::getStacked เพื่อรับจำนวนงานในสแต็กการดำเนินการ สแต็กของผู้ปฏิบัติงานมีเพียงงานที่จำเป็นต้องดำเนินการเท่านั้น เมื่องานบนสแต็กเสร็จสมบูรณ์ งานนั้นจะถูกลบออกและวางบนสแต็กแยกต่างหาก (ภายใน) สำหรับการรวบรวมขยะ (โดยใช้วิธี Worker::collect)

อีกวิธีหนึ่งในการนำเธรดกลับมาใช้ใหม่ในหลายงานคือการใช้เธรดพูล (ผ่านคลาส Pool) เธรดพูลใช้กลุ่มของผู้ปฏิบัติงานเพื่อให้งานสามารถดำเนินการได้ พร้อมกันซึ่งปัจจัยการเกิดพร้อมกัน (จำนวนเธรดพูลที่ดำเนินการด้วย) ถูกตั้งค่าเมื่อสร้างพูล

ลองปรับตัวอย่างข้างต้นเพื่อใช้กลุ่มคนงาน:

งานของคลาสขยายเธรด ( private $value; public function __construct(int $i) ( $this->value = $i; ) public function run() ( usleep(250000); echo "Task: ($this->value) \n"; ) ) $pool = พูลใหม่ (4); สำหรับ ($i = 0; $i ส่ง(งานใหม่($i)); ) ในขณะที่ ($pool->collect()); $พูล->ปิดเครื่อง();

มีความแตกต่างที่เห็นได้ชัดเจนบางประการเมื่อใช้พูลซึ่งต่างจากผู้ปฏิบัติงาน ขั้นแรก ไม่จำเป็นต้องสตาร์ทพูลด้วยตนเอง โดยจะเริ่มดำเนินการงานทันทีที่พูลพร้อมใช้งาน ประการที่สองเรา ส่งงานไปที่พูลไม่ใช่ วางไว้บนกอง- นอกจากนี้ คลาส Pool ไม่ได้สืบทอดมาจาก Threaded และดังนั้นจึงไม่สามารถส่งผ่านไปยังเธรดอื่นได้ (ไม่เหมือนกับ Worker)

ถือเป็นแนวปฏิบัติที่ดีสำหรับผู้ปฏิบัติงานและพูลในการล้างงานของตนทันทีที่เสร็จสิ้น และจากนั้นจึงยุติงานด้วยตนเอง เธรดที่สร้างขึ้นโดยใช้คลาสเธรดจะต้องแนบกับเธรดหลักด้วย

pthreads และ (im) ความไม่แน่นอน

คลาสสุดท้ายที่เราจะพูดถึงคือ Volatile ซึ่งเป็นส่วนเสริมใหม่ของ pthreads v3 ความไม่เปลี่ยนรูปกลายเป็นแนวคิดที่สำคัญใน pthreads เนื่องจากหากไม่มีสิ่งนี้ ประสิทธิภาพจะลดลงอย่างมาก ดังนั้น โดยค่าเริ่มต้น คุณสมบัติของคลาส Threaded ที่ตัวเองเป็นวัตถุ Threaded ในขณะนี้ไม่เปลี่ยนรูป และดังนั้นจึงไม่สามารถเขียนทับได้หลังจากการกำหนดครั้งแรก ในปัจจุบันแนะนำให้ใช้ความไม่แน่นอนที่ชัดเจนสำหรับคุณสมบัติดังกล่าว และยังคงสามารถทำได้โดยใช้คลาส Volatile ใหม่

ลองดูตัวอย่างที่จะแสดงให้เห็นถึงข้อจำกัดความไม่เปลี่ยนรูปใหม่:

Class Task ขยาย Threaded // คลาส Threaded ( ฟังก์ชั่นสาธารณะ __construct() ( $this->data = new Threaded(); // $this->data ไม่สามารถเขียนทับได้ เนื่องจากเป็นคุณสมบัติ Threaded ของคลาส Threaded ) ) $task = new class(new Task()) ขยาย Thread ( // คลาส Threaded เนื่องจาก Thread ขยายฟังก์ชันสาธารณะแบบ Threaded __construct($tm) ( $this->threadedMember = $tm; var_dump($this->threadedMember-> data); // object(Threaded)#3 (0) () $this->threadedMember = new StdClass(); // ไม่ถูกต้อง เนื่องจากคุณสมบัติเป็นสมาชิก Threaded ของคลาส Threaded ) );

ในทางกลับกัน คุณสมบัติเธรดของคลาส Volatile นั้นไม่แน่นอน:

Class Task ขยาย Volatile ( public function __construct() ( $this->data = new Threaded(); $this->data = new StdClass(); // valid, เนื่องจากเราอยู่ใน volatile class ) ) $task = new class(new Task()) ขยาย Thread ( public function __construct($vm) ( $this->volatileMember = $vm; var_dump($this->volatileMember->data); // object(stdClass)#4 (0) () // ยังคงไม่ถูกต้อง เนื่องจาก Volatile ขยาย Threaded ดังนั้นคุณสมบัติยังคงเป็นสมาชิก Threaded ของคลาส Threaded $this->volatileMember = new StdClass() ) );

เราจะเห็นได้ว่าคลาส Volatile จะแทนที่ความไม่เปลี่ยนรูปที่กำหนดโดยคลาส Threaded ระดับบนสุด เพื่อให้สามารถเปลี่ยนคุณสมบัติ Threaded ได้ (รวมถึง unset() ด้วย)

มีการอภิปรายอีกเรื่องหนึ่งเพื่อให้ครอบคลุมหัวข้อความแปรปรวนและคลาสระเหย - อาร์เรย์ ใน pthreads อาร์เรย์จะถูกส่งไปที่อ็อบเจ็กต์ Volatile โดยอัตโนมัติเมื่อกำหนดให้กับคุณสมบัติของคลาส Threaded เนื่องจากมันไม่ปลอดภัยเลยที่จะจัดการกับอาร์เรย์ของบริบท PHP หลายรายการ

ลองดูตัวอย่างอีกครั้งเพื่อทำความเข้าใจบางสิ่งให้ดีขึ้น:

$อาร์เรย์ = ; $task = new class($array) ขยาย Thread ( private $data; public function __construct(array $array) ( $this->data = $array; ) public function run() ( $this->data = 4; $ นี้->ข้อมูล = 5; print_r($this->data) ); $task->start() && $task->join(); /* เอาต์พุต: วัตถุระเหย ( => 1 => 2 => 3 => 4 => 5) */

เราเห็นว่าวัตถุระเหยสามารถปฏิบัติเสมือนว่าเป็นอาร์เรย์ได้ เนื่องจากวัตถุเหล่านั้นสนับสนุนการดำเนินการของอาร์เรย์ เช่น (ดังที่แสดงไว้ด้านบน) ตัวดำเนินการเซ็ตย่อย () อย่างไรก็ตาม คลาสระเหยไม่รองรับฟังก์ชันอาร์เรย์พื้นฐาน เช่น array_pop และ array_shift แต่คลาส Threaded จะให้การดำเนินการที่คล้ายกันกับวิธีการในตัวแทน

เป็นการสาธิต:

$data = คลาสใหม่ขยายความผันผวน ( public $a = 1; public $b = 2; public $c = 3; ); var_dump($ข้อมูล); var_dump($data->ป๊อป()); var_dump($data->shift()); var_dump($ข้อมูล); /* ผลลัพธ์: object(class@anonymous)#1 (3) ( ["a"]=> int(1) ["b"]=> int(2) ["c"]=> int(3) ) int(3) int(1) object(class@anonymous)#1 (1) ( ["b"]=> int(2) ) */

การดำเนินการที่รองรับอื่น ๆ ได้แก่ Threaded::chunk และ Threaded::merge

การซิงโครไนซ์

ในส่วนสุดท้ายของบทความนี้ เราจะดูที่การซิงโครไนซ์ใน pthreads การซิงโครไนซ์เป็นวิธีการที่ช่วยให้คุณควบคุมการเข้าถึงทรัพยากรที่ใช้ร่วมกัน

ตัวอย่างเช่น ลองใช้ตัวนับแบบง่าย:

$counter = คลาสใหม่ขยายเธรด ( public $i = 0; public function run() ( for ($i = 0; $i i; ) ) ); $เคาน์เตอร์->เริ่มต้น(); สำหรับ ($i = 0; $i i; ) $counter->join(); var_dump($เคาน์เตอร์->ผม); // จะพิมพ์ตัวเลขตั้งแต่ 10 ถึง 20

หากไม่ใช้การซิงโครไนซ์ เอาต์พุตจะไม่สามารถกำหนดได้ เธรดหลายรายการเขียนไปยังตัวแปรเดียวกันโดยไม่มีการควบคุมการเข้าถึง ซึ่งหมายความว่าการอัปเดตจะสูญหาย

มาแก้ไขปัญหานี้เพื่อที่เราจะได้ผลลัพธ์ที่ถูกต้องเป็น 20 โดยการเพิ่มเวลา:

$counter = คลาสใหม่ขยายเธรด ( public $i = 0; public function run() ( $this->synchronized(function () ( for ($i = 0; $i i; ) )); ) ); $เคาน์เตอร์->เริ่มต้น(); $counter->synchronized(function ($counter) ( สำหรับ ($i = 0; $i i; ) ), $counter); $เคาน์เตอร์->เข้าร่วม(); var_dump($เคาน์เตอร์->ผม); // int(20)

บล็อกโค้ดที่ซิงโครไนซ์ยังสามารถสื่อสารระหว่างกันได้โดยใช้เมธอด Threaded::wait และ Threaded::notify (หรือ Threaded::notifyAll)

นี่คือการเพิ่มขึ้นแบบอื่นในสองลูปที่ซิงโครไนซ์ในขณะที่:

$counter = คลาสใหม่ขยายเธรด ( public $cond = 1; public function run() ( $this->synchronized(function () ( for ($i = 0; $i notify(); if ($this->cond === 1) ( $นี่->cond = 2; $นี่->รอ(); ) ) )); $เคาน์เตอร์->เริ่มต้น(); $counter->synchronized(function ($counter) ( if ($counter->cond !== 2) ( $counter->wait(); // รอให้อีกอันเริ่มก่อน ) สำหรับ ($i = 10; $i แจ้ง(); if ($counter->cond === 2) ( $counter->cond = 1; $counter->wait(); ) ) ), $counter); $เคาน์เตอร์->เข้าร่วม(); /* ผลลัพธ์: int(0) int(10) int(1) int(11) int(2) int(12) int(3) int(13) int(4) int(14) int(5) int( 15) int(6) int(16) int(7) int(17) int(8) int(18) int(9) int(19) */

คุณอาจสังเกตเห็นเงื่อนไขเพิ่มเติมที่วางไว้รอบการโทรไปยัง Threaded::wait เงื่อนไขเหล่านี้มีความสำคัญเนื่องจากอนุญาตให้การโทรกลับแบบซิงโครไนซ์กลับมาทำงานต่อเมื่อได้รับการแจ้งเตือนและเงื่อนไขที่ระบุเป็นจริง นี่เป็นสิ่งสำคัญเนื่องจากการแจ้งเตือนอาจมาจากที่อื่นนอกเหนือจากเมื่อมีการเรียก Threaded::notify ดังนั้น หากการเรียกไปยังเมธอด Threaded::wait ไม่ได้อยู่ในเงื่อนไข เราจะดำเนินการ โทรปลุกเท็จซึ่งจะนำไปสู่พฤติกรรมโค้ดที่คาดเดาไม่ได้

บทสรุป

เราดูที่ห้าคลาสของแพ็คเกจ pthreads (Threaded, Thread, Worker, Volatile และ Pool) และวิธีการใช้งานแต่ละคลาส นอกจากนี้เรายังดูแนวคิดใหม่ของความไม่เปลี่ยนรูปใน pthreads และให้ภาพรวมโดยย่อเกี่ยวกับความสามารถในการซิงโครไนซ์ที่รองรับ ด้วยพื้นฐานเหล่านี้ ตอนนี้เราสามารถเริ่มดูว่า pthreads สามารถนำมาใช้ในกรณีจริงได้อย่างไร! นี่จะเป็นหัวข้อของโพสต์ถัดไปของเรา

หากสนใจคำแปลของโพสต์ถัดไป โปรดแจ้งให้เราทราบ: แสดงความคิดเห็นบนโซเชียลมีเดีย เครือข่าย โหวตและแชร์โพสต์กับเพื่อนร่วมงานและเพื่อน ๆ

การอภิปรายแบบมีเธรด

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

ข้อดี

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

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

ข้อเสีย

ข้อเสียของการทำเกลียวแบบลำดับชั้นเหนือการทำเกลียวแบบเรียบคือระดับของความซับซ้อนที่เพิ่มขึ้น และมุมมองดังกล่าวจึงต้องการระดับความสะดวกสบายและความซับซ้อนที่เพิ่มขึ้นในส่วนของผู้ใช้ ดังนั้นจึงไม่น่าแปลกใจที่ชุมชนออนไลน์ที่เก่าแก่และ/หรือซับซ้อนที่สุดบางแห่ง เช่น Usenet, CIX หรือ Slashdot มีการใช้งานมากที่สุด เมื่อเปรียบเทียบกันแล้ว ระบบแชทและแสดงความคิดเห็นบนเว็บนั้นมีอายุน้อยกว่าและเปิดกว้างสำหรับผู้ชมในวงกว้าง และด้วยเหตุนี้ เธรดแบบลำดับชั้นจึงกลายเป็นเรื่องธรรมดาในเวทีดังกล่าวเมื่อไม่นานมานี้

การกำหนดลำดับชั้นของต้นไม้ยังมีแนวโน้มที่จะแยกส่วนการสนทนาภายในหัวข้อ: เป็นไปไม่ได้อีกต่อไปที่จะโพสต์ข้อความตอบกลับหรือสรุปโพสต์ก่อนหน้าที่แตกต่างกันหลายรายการ แต่ทุกโพสต์ก่อนหน้านี้จะต้องตอบกลับทีละรายการ เป็นที่ถกเถียงกันอยู่ว่าสิ่งนี้นำไปสู่รูปแบบการโต้วาทีแบบเผชิญหน้ามากขึ้นในเวทีที่ใช้เธรดแบบลำดับชั้น อย่างไรก็ตาม แม้ว่าจะเป็นเรื่องจริงก็ตาม หากการตอบกลับแบบเธรดโดยตรงไม่สามารถทำได้อีกต่อไปเนื่องจากมีการตอบกลับโพสต์ที่ต้องการเป็นจำนวนมาก ผู้ใช้มักจะใช้คำพูดของบุคคลที่ตนตอบกลับเพื่อให้การสนทนาดำเนินไปอย่างต่อเนื่องและลื่นไหล ได้อย่างราบรื่น สิ่งนี้แนะนำโดยชุมชนกระดานข้อความส่วนใหญ่ในกรณีที่เธรดถึงขีดจำกัดที่ครอบคลุมแล้ว

เปิดกระทู้

กระทู้เปิดหมายถึงโพสต์บนบล็อกที่ผู้อ่านสามารถแสดงความคิดเห็นและหารือเกี่ยวกับหัวข้อที่พวกเขาเลือก โดยปกติแล้วจะมีประโยชน์มากกว่าในบล็อกยอดนิยมที่มีปริมาณการเข้าชมจำนวนมาก มักใช้เมื่อผู้เขียนบล็อกไม่มีหัวข้อที่จะโพสต์หรือเมื่อมีการสงบในการโพสต์

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

ตัวอย่าง

*ยาฮู! กลุ่ม [ http://groups.yahoo.com/], กลุ่ม MSN [ http://groups.msn.com/] และสแลชดอท [ http://www.slashdot.com/] ทั้งหมดมีฟอรัมบนเว็บที่มีการสนทนาแบบเป็นชุดข้อความ

ดูเพิ่มเติม

* การเขียน Skywriting เชิงวิชาการ
* รายการเงื่อนไขการเขียนบล็อก

อ้างอิง

*ดาร์ตมัธ. (2546) - http://www.dartmouth.edu/~webteach/articles/discussion.html "การสนทนาออนไลน์" ]
*วอลซีย์, ที. เดเวียร์, [ http://www.readingonline.org/articles/art_index.asp?HREF=wolsey/index.html "การอภิปรายด้านวรรณกรรมในโลกไซเบอร์: วัยรุ่นรุ่นเยาว์ใช้กลุ่มสนทนาแบบมีเธรดเพื่อพูดคุยเกี่ยวกับหนังสือ- "Reading Online", 7(4), มกราคม/กุมภาพันธ์ 2547 สืบค้นเมื่อ 30 ธันวาคม 2550

มูลนิธิวิกิมีเดีย

  • 2010.
  • ลีออน พาว

บารห์ อาซูม

    ดูพจนานุกรมอื่นๆ:ฟอรั่มอินเทอร์เน็ต

    - แพคเกจซอฟต์แวร์ phpBB Internet Forum หนึ่งในแพ็คเกจฟอรัมยอดนิยมที่สุด… Wikipediaประวัติความเป็นมาของสภาพแวดล้อมการเรียนรู้เสมือนจริงในทศวรรษ 1990

    - ในประวัติศาสตร์ของสภาพแวดล้อมการเรียนรู้เสมือนจริง ทศวรรษ 1990 เป็นช่วงเวลาของการเติบโต โดยมีสาเหตุหลักมาจากการถือกำเนิดของคอมพิวเตอร์ราคาไม่แพงและอินเทอร์เน็ต พ.ศ. 2533 พ.ศ. 2533* Formual Systems Inc. แห่งเมืองพรินซ์ตัน รัฐนิวเจอร์ซี สหรัฐอเมริกา แนะนำการประเมินตาม DOS… … Wikipedia- การทำงานร่วมกันแบบเห็นหน้ากัน นักพัฒนาสภาพแวดล้อมทางการศึกษา LEAD consortium Stable release 5.0 / มิถุนายน 2553 ระบบปฏิบัติการ ข้ามแพลตฟอร์ม … Wikipedia

    เธรดการสนทนา- เป็นคุณสมบัติที่ใช้โดยไคลเอนต์อีเมล กระดานข่าว กลุ่มข่าวสาร หรือฟอรัมอินเทอร์เน็ต ซึ่งซอฟต์แวร์ช่วยเหลือผู้ใช้โดยการจัดกลุ่มข้อความแบบมองเห็น โดยปกติแล้วข้อความจะถูกจัดกลุ่มตามภาพตามลำดับชั้นตามหัวข้อ ชุดข้อความที่จัดกลุ่ม... ... Wikipedia

    สแลชดอท- ภาพหน้าจอของ URL หน้าหลักของ Slashdot.org slashdot.org ข่าวสโลแกนสำหรับผู้สนใจ สิ่งที่สำคัญ...วิกิพีเดีย

    มีเดียวิกิ- เนมสเปซเปลี่ยนเส้นทางที่นี่ สำหรับความช่วยเหลือเกี่ยวกับเนมสเปซมีเดียวิกิบนวิกิพีเดีย โปรดดูวิธีใช้:เนมสเปซมีเดียวิกิ สำหรับข้อมูลทั่วไปเกี่ยวกับเนมสเปซของวิกิพีเดีย ดูที่ วิกิพีเดีย:เนมสเปซ หน้าพูดคุยและหน้าพูดคุยของ MediaWiki เปลี่ยนเส้นทางที่นี่ สำหรับ... ... วิกิพีเดีย

    การสื่อสารโดยใช้คอมพิวเตอร์เป็นสื่อกลาง- สำหรับความหมายอื่น ดูที่ CMC (แก้ความกำกวม) การสื่อสารผ่านสื่อคอมพิวเตอร์ (CMC) หมายถึงธุรกรรมการสื่อสารใดๆ ที่เกิดขึ้นผ่านการใช้คอมพิวเตอร์ในเครือข่ายตั้งแต่สองเครื่องขึ้นไป ในขณะที่คำนี้โดยดั้งเดิมจะหมายถึง… … Wikipedia

    การเปรียบเทียบซอฟต์แวร์วิกิ- ตารางต่อไปนี้เปรียบเทียบข้อมูลทั่วไปและข้อมูลทางเทคนิคสำหรับแพ็คเกจซอฟต์แวร์วิกิจำนวนหนึ่ง สารบัญ 1 ข้อมูลทั่วไป 2 กลุ่มเป้าหมาย 3 ลักษณะเด่น 1 4 ลักษณะเด่น 2 … Wikipedia

    การเขียน Skywriting เชิงวิชาการ- เป็นคำที่คิดค้นโดยนักวิทยาศาสตร์ด้านความรู้ความเข้าใจ Stevan Harnad ซึ่งอธิบายการรวมกันของอีเมลหลายฉบับและหัวข้อที่เก็บถาวรบนเว็บแบบเธรด เช่น กลุ่มข่าว รายชื่อผู้รับจดหมายอิเล็กทรอนิกส์ ไฮเปอร์เมล netnews หรือฟอรัมอินเทอร์เน็ต เชื่อมโยงและจัดเรียงตามวันที่... … Wikipedia

    ซอฟต์แวร์การตัดสินใจร่วมกัน- ซอฟต์แวร์การตัดสินใจร่วมกัน (CDM) คือแอปพลิเคชันซอฟต์แวร์หรือโมดูลที่ประสานฟังก์ชันและคุณสมบัติที่จำเป็นในการตัดสินใจร่วมกันอย่างทันท่วงที ช่วยให้ผู้มีส่วนได้ส่วนเสียที่เกี่ยวข้องทั้งหมดมีส่วนร่วมในกระบวนการนี้ The... ... วิกิพีเดีย

ฉันเพิ่งลองใช้ pthreads และรู้สึกประหลาดใจมาก มันเป็นส่วนขยายที่เพิ่มความสามารถในการทำงานกับเธรดจริงหลายเธรดให้กับ PHP ไม่มีการจำลอง ไม่มีเวทย์มนตร์ ไม่มีของปลอม ทุกอย่างมีจริง



ฉันกำลังพิจารณางานดังกล่าว มีงานที่ต้องทำให้เสร็จอย่างรวดเร็ว PHP มีเครื่องมืออื่นๆ สำหรับการแก้ปัญหานี้ ไม่ได้กล่าวถึงในที่นี้ บทความเกี่ยวกับ pthreads



pthreads คืออะไร

แค่นั้นแหละ! เกือบทุกอย่าง อันที่จริง มีบางอย่างที่อาจทำให้ผู้อ่านที่อยากรู้อยากเห็นไม่พอใจ สิ่งนี้ใช้ไม่ได้กับ PHP มาตรฐานที่คอมไพล์ด้วยตัวเลือกเริ่มต้น หากต้องการเพลิดเพลินกับมัลติเธรด คุณต้องเปิดใช้งาน ZTS (Zend Thread Safety) ใน PHP ของคุณ

การตั้งค่า PHP

ถัดไป PHP กับ ZTS อย่าใส่ใจกับความแตกต่างอย่างมากของเวลาดำเนินการเมื่อเทียบกับ PHP ที่ไม่มี ZTS (37.65 เทียบกับ 265.05 วินาที) ฉันไม่ได้พยายามสรุปการตั้งค่า PHP ให้เป็นภาพรวม ในกรณีที่ไม่มี ZTS ฉันเปิดใช้งาน XDebug ไว้แล้ว


อย่างที่คุณเห็นเมื่อใช้ 2 เธรด ความเร็วของการทำงานของโปรแกรมจะสูงกว่าในกรณีของโค้ดเชิงเส้นประมาณ 1.5 เท่า เมื่อใช้ 4 เธรด - 3 ครั้ง


โปรดทราบว่าแม้ว่าโปรเซสเซอร์จะเป็น 8 คอร์ แต่เวลาดำเนินการของโปรแกรมยังคงแทบไม่เปลี่ยนแปลงหากใช้มากกว่า 4 เธรด ดูเหมือนว่านี่เป็นเพราะโปรเซสเซอร์ของฉันมีคอร์จริง 4 คอร์ เพื่อความชัดเจนฉันได้แสดงภาพเพลตในรูปแบบของไดอะแกรม


ประวัติย่อ

ใน PHP คุณสามารถทำงานได้อย่างหรูหราด้วยมัลติเธรดโดยใช้ส่วนขยาย pthreads สิ่งนี้ทำให้ผลผลิตเพิ่มขึ้นอย่างเห็นได้ชัด

แท็ก: เพิ่มแท็ก