PDA

View Full Version : درخواست راهنمایی در مورد thread pool



ایمان اختیاری
چهارشنبه 18 فروردین 1389, 09:35 صبح
سلام
قبلا در پست
http://www.barnamenevis.org/forum/showthread.php?p=308765
دوستان زحمت کشیده بودن و در این مورد یه سری توضیحات داده بودن
ولی خب به نظرم یه کمی کم بود ...
از دوستان عزیز کسی می تونه در این مورد کمک کنه و توضیحات بیشتری در مورد مزایا و معایبش بده ..
می خوام توی لایه ی دیتای یه برنامه از این روش استفاده کنم ولی هنوز شک دارم که مناسب باشه یا بیشتر سربار باشه تا کمک ...
نمی دونم آیا روش بهتری هم به جاش می شه استفاده کرد یا خیر ..
متشکراتم

mehdi.mousavi
چهارشنبه 18 فروردین 1389, 19:07 عصر
سلام قبلا در پست
http://www.barnamenevis.org/forum/showthread.php?p=308765
دوستان زحمت کشیده بودن و در این مورد یه سری توضیحات داده بودن ولی خب به نظرم یه کمی کم بود ... از دوستان عزیز کسی می تونه در این مورد کمک کنه و توضیحات بیشتری در مورد مزایا و معایبش بده .. می خوام توی لایه ی دیتای یه برنامه از این روش استفاده کنم ولی هنوز شک دارم که مناسب باشه یا بیشتر سربار باشه تا کمک ... نمی دونم آیا روش بهتری هم به جاش می شه استفاده کرد یا خیر .. متشکراتم

سلام.
دقیقا نیازتون چی هستش که فکر می کنید Thread Pool پاسخ مناسبی به اون نیازه؟ در واقع میخوام بدونم این کارو Asynchronous میخواهید انجام بدید، که فرصت داشته باشید تو برنامه چیکار کنید؟ آیا از Web Service ای بعنوان Business Layer استفاده می کنید یا خیر؟ اندکی در مورد نیازتون توضیح بدید تا بهتون پاسخ بدم.

موفق باشید.

ایمان اختیاری
پنج شنبه 19 فروردین 1389, 08:41 صبح
ببینید ... یه برنامه ی چند لایه می خوام بنویسم که روی یه سری سیستم به صورت کلاینت سرور اجرا بشه ... برای یه بخشی هست که تقریبا شبیه کافی نته ..
برنامه ی قبلی به این صورت بود که کلاینت مستقیم روی دیتابیس سرور کار انجام می داد و خب این خیلی ضایع بود ..
حالا می خوام برنامه رو به این صورت بنویسم که اطلاعات بین کلاینت و دیتابیس از یک لایه برنامه رد بشن ...
توی قسمت سرور به این نتیجه رسیدم که خب بهتره از thread استفاده بشه .. ولی چه تعداد نخ مورد نیازه نمی دونم ... چون قراره برنامه رو گسترش بدم و ممکنه از 50 تا کلاینت به 200 تا برسه ..
توی سرچهایی که انجام دادم به موضوع مخزن نخ برخوردم ... به نظر مناسب می یاد ولی چون باهاش کار نکردم نمی دونم مفید هست یا سربار روی سیستم ایجاد می کنه..
برای جناب وجید نصیری هم ایمیل زدم ایشون گفت بهتره اگه می خوای از نخ استفداه کنی WFC هم توی قسمت سرور به کار ببری که مدیریت نخ ها رو بدی دست اکتیو دایرکتوری ...
حالا واقعا نمی دونم آیا اصلا این مفید هست با آیا روش دیگری برای این کار می شه استفاده کرد یا نه ..
متشکرم

mehdi.mousavi
پنج شنبه 19 فروردین 1389, 10:12 صبح
ببینید ... یه برنامه ی چند لایه می خوام بنویسم که روی یه سری سیستم به صورت کلاینت سرور اجرا بشه ... برای یه بخشی هست که تقریبا شبیه کافی نته ..
برنامه ی قبلی به این صورت بود که کلاینت مستقیم روی دیتابیس سرور کار انجام می داد و خب این خیلی ضایع بود .. حالا می خوام برنامه رو به این صورت بنویسم که اطلاعات بین کلاینت و دیتابیس از یک لایه برنامه رد بشن ... توی قسمت سرور به این نتیجه رسیدم که خب بهتره از thread استفاده بشه .. ولی چه تعداد نخ مورد نیازه نمی دونم ... چون قراره برنامه رو گسترش بدم و ممکنه از 50 تا کلاینت به 200 تا برسه .. توی سرچهایی که انجام دادم به موضوع مخزن نخ برخوردم ... به نظر مناسب می یاد ولی چون باهاش کار نکردم نمی دونم مفید هست یا سربار روی سیستم ایجاد می کنه.. برای جناب وجید نصیری هم ایمیل زدم ایشون گفت بهتره اگه می خوای از نخ استفداه کنی WFC هم توی قسمت سرور به کار ببری که مدیریت نخ ها رو بدی دست اکتیو دایرکتوری ... حالا واقعا نمی دونم آیا اصلا این مفید هست با آیا روش دیگری برای این کار می شه استفاده کرد یا نه .. متشکرم


سلام.
از اینکه مطلب رو کامل توضیح دادید، متشکرم. من نمیدونم آقای نصیری چی مد نظرشون بوده، اما برای استفاده از هر چیزی، باید دلیل مناسبی داشت. چه نیازی هستش که شما Active Directory رو وارد این بازی کنید؟

تصمیمی که گرفته اید کاملا خوب و فنی هستش. منظورم اضافه کردن لایه ای به سیستم برای تعامل با داده ها هستش. به این منظور میتونید از یک Web Service استفاده کنید. هنگامیکه از Web Service استفاده کنید، دیگه نیازی نیست نگران مدیریت Thread ها باشید. IIS خودش درخواستها رو توی Thread های متفاوت از کاربران بطور همزمان میگیره و شما این فرصت رو دارید که سرویسهای مورد نظر رو بصورت Synchronous انجام بدید. بدین ترتیب که Client اول وب متود یک رو از وب سرویس فراخوانی میکنه و درخواست خودش رو بدن ترتیب اعلام میکنه. شما از این درخواست، با اجرا شدن وب متود مزبور مطلع میشید، بدون اینکه نیاز به انجام کار خاصی داشته باشید، با استفاده از لایه های متفاوتی که در خود وب سرویس طراحی کرده اید، سراغ بانک میرید، داده ها رو دریافت کرده، پردازش میکنید، و در نهایت اونها رو بشکل یک XML به Client برمیگردونید.

حالا همین روند رو برای دو Client که بطور همزمان وب متود یک رو اجرا میکنن در نظر بگیرید. Client اول وب متود یک رو فراخوانی میکنه، و شما کار رو شروع میکنید. در نیمه های راه، Client دوم، وب متود یک رو فراخوانی میکنه، چون به همون سرویس نیاز داره.

اینجا Instance جدیدی از کلاس سرویس شما ایجاد میشه، (توی یک Thread دیگه که مدیریتش با IIS هست) و وب متود یک فراخوانی میشه. دقت کنید! الان دو Instance متفاوت از سرویس دارن یک کار رو، توی دو زمان متفاوت بطور همزمان انجام میدن.

بدین ترتیب، دیگه نیازی نیست که پیچیدگی رو به خود برنامه تحمیل کنید. اگر کار دیگه ای میخواستید انجام بدید که نیاز به مدیریت Thread ها توسط خودتون داشت، حتما توصیه من متفاوت بود. اما الان، به همین سادگی، شما کار دشوار مدیریت Thread ها رو به دوش Module ای گذاشته اید که برای این کار طراحی شده!

وقتی Web Service ای میسازید، هنگام کامپایل، کلاسهای Proxy ای برای سرویس شما ایجاد میشه که امکان فراخوانی Asynchronous متود ها رو هم بهتون میده. بعبارت دیگه، جای اینکه منتظر باشید تا فراخوانی متود MyMethod از وب سرویس تمام بشه و نتیجه بهتون برگردونده بشه، میتونید با ساز و کارهای در نظر گرفته شده در کلاس خودکار تولید شده Proxy، متود MyMethodAsync رو فراخوانی کنید.

بدین ترتیب، شما با یک تیر دو نشون میزنید. اول اینکه خودتون رو از مدیریت Thread ها سمت Service برحذر داشته اید. دوم اینکه سمت Client هم نیازی به ایجاد Thread برای تعامل با شرایطی که اجرای یک Web Method زمانبر هستش، ندارید. شما MyMethodAsync رو (که خودش بطور خودکار از روی MyMethod ساخته شده) صدا میزنید، تا کار شروع بشه. هر وقت هم کار تموم بشه و نتیجه آماده باشه، میتونید از این نتیجه با ساز و کارهای موجود در Proxy مطلع بشید و روند اجرای برنامه رو در پیش بگیرید.

البته بهتره سرویس مورد نظر روی پروتکل SOAP ارائه بشه، ws-security بهش اضافه بشه و بسیاری کارهای دیگه، تا بتونید


اطلاعات رد و بدل شده روی خط رو امضاء کنید.
اطلاعات رو برای امنیت بیشتر، کد کنید.
عملیات Authentication رو بصورت Inbound کنترل کنید تا نیازی به ارسال ID و Password توی هر متود بصورت Explicitly نباشه.
و ...

برای انجام اینکارها نیز، نیاز به WSE یا Web Service Extensions دارید. بکمک WSE کار خیلی ساده تر انجام میشه. مگر اینکه بگید فعلا نیازی به این پیچیدگی ها ندارم و دسترسی به Web Service بصورت Basic Authentication هم قابل قبوله که در این شرایط، کافیه تا فقط IIS رو برای این مساله Config کنید و فقط Web Service خودتون رو بنویسید.

توضیحات بیشتر رو می تونید روی MSDN پیدا کنید.

موفق باشید.

ایمان اختیاری
پنج شنبه 19 فروردین 1389, 11:43 صبح
جناب موسوی .. اول اینکه از اطلاعات واقعا مفیدتون خیلی متشکرم .. اما چون با وب سرویس کار نکردم چند تا سوال دارم خدمتتون...
سوال اول اینکه برنامه ایی که توی سمت کلاینته به صورت windows application نوشته شده .. آیا می تونه به راحتی با وب سرویسی که فرمودین ارتباط برقرار کنه ؟
سوال دوم اینکه توی vs2010 من یه چیزی به اسم WCF SErvice application دیدم .. آیا این مورد مد نظرتون بود ؟
سوال سوم اینکه IIS تا چند مورد می تونه connection داشته باشه ... آخه روی برنامه ی مروارید ( سامانه ی مروارید دانشگاه آزاد ) دیده بودم زیاد نمی تونه در مقابل پردازش های سنگین یا تعداد بالا دووم بیاره ..
سوال چهارمی که داشتم این بود که آیا اماکن این وجود داره که بدونم کدوم کلاینت به کدوم thread وصله که بدونم کدوم کلاینت داره چیکار می کنه یا اصولا فعال هستش ؟
بازم از لطفتون متشکرم

mehdi.mousavi
پنج شنبه 19 فروردین 1389, 11:51 صبح
جناب موسوی .. اول اینکه از اطلاعات واقعا مفیدتون خیلی متشکرم .. اما چون با وب سرویس کار نکردم چند تا سوال دارم خدمتتون...

سلام.
قابلی نداشت. :)


سوال اول اینکه برنامه ایی که توی سمت کلاینته به صورت windows application نوشته شده .. آیا می تونه به راحتی با وب سرویسی که فرمودین ارتباط برقرار کنه ؟
100%. استفاده از وب سرویسها به نوع Application ربطی پیدا نمی کنه.


سوال دوم اینکه توی vs2010 من یه چیزی به اسم WCF SErvice application دیدم .. آیا این مورد مد نظرتون بود ؟ من با WCF هنوز کار نکرده ام، من منظورم ASP.NET Web Service Application بودش. هر سوالی در این زمنیه یا WSE 3.0 داشته باشید، میتونم کمک کنم. اما در مورد WCF (و مزیتهایی که احتمالا به ASP.NET Web Service ها داره) میتونید در بخش WCF سوال مزبور رو جستجو کنید، در صورت عدم وجود سوال رو در تالار مزبور مطرح کنید تا دیگران به اون پاسخ بدن.


سوال سوم اینکه IIS تا چند مورد می تونه connection داشته باشه ... آخه روی برنامه ی مروارید ( سامانه ی مروارید دانشگاه آزاد ) دیده بودم زیاد نمی تونه در مقابل پردازش های سنگین یا تعداد بالا دووم بیاره ..IIS ای که همراه Windows XP و بقیه نسخه های ویندوز Workstation هستش، بطور همزمان تا 10 تا Connection رو میتونه پشتیبانی کنه (که البته با دستکاری در Meta Data های IIS این محدودیت قابل رفع هستش) اما در واقعیت برای کارهای سنگین درست نشده. شما برای Deploy کردن حتما باید از یکی از نسخه های Windows Server استفاده کنید که در اینصورت با محدودیتی مواجه نخواهید بود.


سوال چهارمی که داشتم این بود که آیا اماکن این وجود داره که بدونم کدوم کلاینت به کدوم thread وصله که بدونم کدوم کلاینت داره چیکار می کنه یا اصولا فعال هستش؟بهتره اینو بعنوان بخشی از سرویس خودتون در نظر بگیرید. بعبارت دیگه، هر Client وضعیت فعلی خودش رو به Web Service اطلاع بده و Web Service در صورت نیاز، وضعیت هر Client رو بر اساس این داده ها به Client های دیگه اعلام کنه...

موفق باشید.