ورود

View Full Version : نحوه اجرای foreach به صورت موازی



kiapmc
چهارشنبه 16 خرداد 1403, 11:01 صبح
سلام
با یک مشکل بزرگی مواجه شدم جستجو کردم به این نتیجه رسیدم که باید به صورت موازی عمل کنه برنامه در foreach که وقتی به این قسمت میرسه به علت تعداد زیاد کاربر این عمل یک ساعت طول میکشه

و تا عمل فوق تمام نشه برنامه کار نمیکنه تا عمل خوق به اتمام برسه حالا میخواستم یک کاری کنم به صورت موازی کار کنه

من دستور سلام را می فرستم به برنامه برنامه از طریق حلقه foreach شروع میکنه به 2000 تا کاربر پیام سلام را می فرستد این عمل یک ساعت طول میکشه حالا اگر در این میاد دستور خوب هستید رو هم بفرستم عمل نمیکنه چون دستور سلام در حال اجرا است میخواستم عملیات foreach به صورت موازی عمل کنه چی کار باید بکنم مقداری سرچ و جستجو کردم دیدم که برای حل این مشکل باید به صورت موازی foreach عمل کنه در این صورت 100 تا دستور هم بفرستم همزمان به فانکشل foreach عمل میکنه

دوستان برای این مشکل نمونه کد چیزی دارید که بتوانم روش کار کنم

mazoolagh
چهارشنبه 16 خرداد 1403, 13:28 عصر
سلام و روز خوش

این پرسشی که مطرح کردین پیچیده و پیشرفته است.
چیزهایی هست که باید به اونها واقعا مسلط باشین و مکانیسم کار رو بدونین:
cron job ، curl ،
parallel processing (که با multi-threading متفاوت هست).

همچنین باید مشخص باشه این پیام (ایمیل؟) چه جوری ارسال میشه،
ممکنه خود سرویس یا اکستنشنی که استفاده میکنین ارسال همزمان رو پشتیبانی کنه.

نمونه کد وقتی میشه گفت که کد شما هم پیوست باشه (کد دقیق)،
همچنین ممکنه شما نمونه کدی پیدا کنین که برای سرور ویندوزی باشه و روی سرور لینوکس کار نکنه!
برای همین اگر این یک پروژه واقعی هست و شما هم به این مباحث تسلط کافی ندارین بهتره که اون رو برون سپاری کنین.
چون برای پیشنهاد یک پاسخ و روش مناسب و همچنین پیاده سازی اون،
نیاز هست که همه ابعاد و جوانب کار مشخص باشه.

ولی اگر قصد یادگیری دارین برای شروع و به عنوان راهنمایی میشه گفت که یک روتین جداگانه برای ارسال پیام مینویسین که:
آدرس(های) گیرنده(ها)، body و subject رو به عنوان پارامتر بگیره،
و در foreach این پروسه رو با popen (یا بهتر proc_open) سدا بزنین و یک pipe درست کنین.

در نظر داشته باشین که این فقط یک راه ممکن هست و همین هم به شکل های مختلفی میشه پیاده اش کرد.

kiapmc
چهارشنبه 16 خرداد 1403, 16:07 عصر
سلام و روز خوش

این پرسشی که مطرح کردین پیچیده و پیشرفته است.
چیزهایی هست که باید به اونها واقعا مسلط باشین و مکانیسم کار رو بدونین:
cron job ، curl ،
parallel processing (که با multi-threading متفاوت هست).

همچنین باید مشخص باشه این پیام (ایمیل؟) چه جوری ارسال میشه،
ممکنه خود سرویس یا اکستنشنی که استفاده میکنین ارسال همزمان رو پشتیبانی کنه.

نمونه کد وقتی میشه گفت که کد شما هم پیوست باشه (کد دقیق)،
همچنین ممکنه شما نمونه کدی پیدا کنین که برای سرور ویندوزی باشه و روی سرور لینوکس کار نکنه!
برای همین اگر این یک پروژه واقعی هست و شما هم به این مباحث تسلط کافی ندارین بهتره که اون رو برون سپاری کنین.
چون برای پیشنهاد یک پاسخ و روش مناسب و همچنین پیاده سازی اون،
نیاز هست که همه ابعاد و جوانب کار مشخص باشه.

ولی اگر قصد یادگیری دارین برای شروع و به عنوان راهنمایی میشه گفت که یک روتین جداگانه برای ارسال پیام مینویسین که:
آدرس(های) گیرنده(ها)، body و subject رو به عنوان پارامتر بگیره،
و در foreach این پروسه رو با popen (یا بهتر proc_open) سدا بزنین و یک pipe درست کنین.

در نظر داشته باشین که این فقط یک راه ممکن هست و همین هم به شکل های مختلفی میشه پیاده اش کرد.

ممنون از راهنمائی شما

من یک نمونه کد واسه این پیدا کردم


<?php
declare(ticks = 1);
$filesArray = [ 'file-0', 'file-1', 'file-2', 'file-3', 'file-4', 'file-5', 'file-6', 'file-7', 'file-8', 'file-9',];
$maxThreads = 3;
$child = 1;
pcntl_signal(SIGCHLD, function ($signo) { global $child; if ($signo === SIGCLD) { while (($pid = pcntl_wait($signo, WNOHANG)) > 0) { $signal = pcntl_wexitstatus($signo); $child--; } }});
foreach ($filesArray as $item) {
while ($child >= $maxThreads) {
sleep(1); }
$child++; $pid = pcntl_fork();
if ($pid) {
} else {
// Here your stuff.
sleep(2);
print_r( posix_getpid()." - $item \n");
exit(0);
}}while ($child != 0) {
sleep(3);}




ولی نمیدونم چرا کار نمیکند دوستان راهنمایی میکنند بتونیم تکمیلش کنیم

دوستان اگر کسی انجام می دهد برای من لطفا اعلام کنند تا زحمتش رذا بهش بدیم هزینه رو هم پرداخت میکنیم

mazoolagh
چهارشنبه 16 خرداد 1403, 16:30 عصر
کدهایی رو که با جستجو (یا کمک از هوش ساختگی) پیدا میکنین،
ممکنه نیاز به یک سری کتابخانه و پلاگین و اکستنشن داشته باشه.
این نمونه کد هم بر مبنای اکستنشن posix هست.

اینجا یک انجمن آموزشی هست و مناسب برای پروژه دادن نیست،
هم وقت و هم پول شما هدر میشه.
اینجا (و مشابه) اگر کسی در پیام خصوصی به شما پیشنهاد انجام کار در برابر پول کرد قطعا سرتون کلاه میره.

در سایت های فریلنسری مثل پونیشا و پارس کدرز و ... مطرح کنین (دقیق):
اونها هم مکانیسم خوبی برای حفاظت از منافع طرفین دارن،
هم زمان و هزینه مشخص هست،
هم سابقه کار مجری ها رو میتونین چک کنین،
و هم به دلیل رقابتی بودن قیمتی که پیشنهاد میدن واقعی(تر) هست.