পাইকিউটি অ্যাপ্লিকেশনটিতে থ্রেডিং: কিউটি থ্রেড বা পাইথন থ্রেড ব্যবহার করবেন?


116

আমি একটি জিইউআই অ্যাপ্লিকেশন লিখছি যা নিয়মিত ওয়েব সংযোগের মাধ্যমে ডেটা পুনরুদ্ধার করে। যেহেতু এই পুনরুদ্ধারটি কিছুটা সময় নেয় তাই এটি পুনরুদ্ধার প্রক্রিয়া চলাকালীন ইউআইকে প্রতিক্রিয়াশীল করে তোলে (এটি ছোট অংশে বিভক্ত করা যায় না)। এই কারণেই আমি একটি পৃথক কর্মী থ্রেডে ওয়েব সংযোগটি আউটসোর্স করতে চাই।

[হ্যাঁ, আমি জানি, এখন আমার দুটি সমস্যা আছে ]]

যাইহোক, অ্যাপ্লিকেশনটি পাইকিউটি 4 ব্যবহার করে, তাই আমি আরও ভাল পছন্দটি জানতে চাই: কিউটির থ্রেড ব্যবহার করুন বা পাইথন threadingমডিউলটি ব্যবহার করুন ? প্রত্যেকের সুবিধা / অসুবিধাগুলি কী কী? নাকি আপনার কাছে একেবারেই আলাদা পরামর্শ আছে?

সম্পাদনা (পুনরায় অনুগ্রহ): যদিও আমার বিশেষ ক্ষেত্রে সমাধানটি সম্ভবত জেফ ওবার এবং লুকা লালিনস্কের মতো একটি অ-ব্লকিং নেটওয়ার্ক অনুরোধ ব্যবহার করবে যেমন পরামর্শ দেওয়া হয়েছে (সুতরাং মূলত নেটওয়ার্কিং বাস্তবায়নের ক্ষেত্রে একযোগের সমস্যাগুলি ছেড়ে দেওয়া), আমি এখনও আরও কিছু চাই সাধারণ প্রশ্নের গভীরতর উত্তর:

পাইকিউটি 4 এর (অর্থাত্ কিউটিস) থ্রেডগুলি দেশীয় পাইথন থ্রেডগুলির ( threadingমডিউল থেকে) উপর ব্যবহার করার সুবিধা এবং অসুবিধাগুলি কী ?


সম্পাদনা 2: আপনার উত্তরগুলির জন্য সমস্ত ধন্যবাদ। যদিও ১০০% চুক্তি নেই, সেখানে ব্যাপক conক্যমত্য বলে মনে হচ্ছে যে উত্তরটি "Qt ব্যবহার করুন", যেহেতু এর সুবিধাটি অন্যান্য লাইব্রেরির সাথে একীকরণ, যখন কোনও সত্যিকারের অসুবিধা না ঘটে।

দুই থ্রেডিং বাস্তবায়নের মধ্যে নির্বাচন খুঁজছেন যে কেউ জন্য, আমি অত্যন্ত সুপারিশ তারা PyQt মেইলিং লিস্ট থ্রেড সহ এখানে দেওয়া সব উত্তর পড়তে মঠাধ্যক্ষ লিঙ্ক।

অনুগ্রহের জন্য আমি বেশ কয়েকটি উত্তর বিবেচনা করেছি; শেষ পর্যন্ত আমি খুব প্রাসঙ্গিক বাহ্যিক রেফারেন্সের জন্য অ্যাবট বেছে নিয়েছি; এটি অবশ্য একটি ঘনিষ্ঠ কল ছিল।

আবার ধন্যবাদ.

উত্তর:


106

পিআইকিউটি মেলিং তালিকায় খুব বেশিদিন আগে এটি আলোচনা করা হয়েছিল । এই বিষয়ে জিওভান্নি বাজোর মন্তব্যের উদ্ধৃতি :

এটি বেশিরভাগ ক্ষেত্রে একই রকম। মূল পার্থক্য হ'ল কিউথ্রেডগুলি কিউটি (অ্যাসিনক্রনাস সিগন্যালস / স্লটস, ইভেন্ট লুপ ইত্যাদি) এর সাথে আরও ভালভাবে সংহত করা হয়। এছাড়াও, আপনি পাইথন থ্রেড থেকে কিউটি ব্যবহার করতে পারবেন না (উদাহরণস্বরূপ আপনি কিউপ্লিকেশন.পোস্টইভেন্টের মাধ্যমে ইভেন্টের মূল থ্রেডে পোস্টের ইভেন্ট করতে পারবেন না): এটির কাজ করার জন্য আপনার কিউথ্রেড দরকার।

থাম্বের একটি সাধারণ নিয়ম হতে পারে আপনি যদি Qt এর সাথে কোনওভাবে ইন্টারঅ্যাক্ট করতে চলেছেন এবং অন্যথায় পাইথন থ্রেড ব্যবহার করেন তবে কিউথ্রেড ব্যবহার করা উচিত।

এবং পাইকিট-র লেখকের এই বিষয়ে কিছু পূর্ববর্তী মন্তব্য: "তারা উভয় একই দেশীয় থ্রেড বাস্তবায়নের আশেপাশে"। এবং উভয় বাস্তবায়ন একইভাবে জিআইএল ব্যবহার করে।


2
উত্তম উত্তর, তবে আমি মনে করি আপনি কোথায় সংক্ষিপ্ত বিবরণ দিচ্ছেন না তবে মেইলিং তালিকা থেকে জিওভান্নি
বাজোর

2
আমি ভাবছি আপনি কেন QApplication.postEvent () এর মাধ্যমে মূল থ্রেডে ইভেন্টগুলি পোস্ট করতে পারবেন না এবং এর জন্য কিউথ্রেডের দরকার নেই কেন? আমি মনে করি আমি লোকেরা এটি করতে দেখেছি এবং এটি কাজ করে।
ট্রেলারিয়ন

1
QCoreApplication.postEventক্রস-প্ল্যাটফর্মটি চালিত এমন এক অ্যাপ্লিকেশনে আমি প্রতি সেকেন্ডে 100 বার হারে পাইথন থ্রেড থেকে ফোন করেছি এবং এটি 1000 ঘন্টা ধরে পরীক্ষা করা হয়েছে। আমি এটি থেকে কোনও সমস্যা দেখিনি। আমি মনে করি গন্তব্য অবজেক্ট মেইনথ্রেড বা কিউথ্রেডে অবস্থিত না হওয়া পর্যন্ত এটি ঠিক আছে। আমি এটিকে একটি ভাল লাইব্রেরিতে গুটিয়ে রেখেছি , কিউটিলগুলি দেখুন
থ্রি_ আনারস

2
এই প্রশ্ন ও উত্তরের অত্যন্ত আপ- ভোটিত প্রকৃতি দেওয়া, আমি মনে করি এটিখোমোরোর একটি সাম্প্রতিক এসও উত্তরটি উল্লেখ করা ভাল যা পাইথন থ্রেড থেকে নির্দিষ্ট কিউটি পদ্ধতি ব্যবহার করা নিরাপদ যে অবস্থার বিষয়ে বিশদ দিয়েছিল। আমার এবং @ ট্রাইরিওলিয়নের দ্বারা দেখা এই পর্যবেক্ষণ আচরণের সাথে এই দীর্ঘতা।
তিন_ আনারস

33

পাইথনের থ্রেডগুলি সহজ এবং নিরাপদ হবে এবং যেহেতু এটি আই / ও-ভিত্তিক অ্যাপ্লিকেশনটির জন্য তাই তারা জিআইএলকে বাইপাস করতে সক্ষম হয়। তাতে বলা হয়েছে, আপনি কি মোড়কে বা নন-ব্লকিং সকেট / সিলেক্ট করে অ / ব্লকিং আই / ও বিবেচনা করেছেন?

সম্পাদনা: থ্রেডে আরও

পাইথন থ্রেড

পাইথনের থ্রেডগুলি সিস্টেম থ্রেড। তবে পাইথন গ্লোবাল ইন্টারপ্রেটার লক (জিআইএল) ব্যবহার করে তা নিশ্চিত করে যে দোভাষী কেবল একবারেই বাইট-কোড নির্দেশের নির্দিষ্ট আকারের ব্লক কার্যকর করে চলেছেন। ভাগ্যক্রমে, পাইথন ইনপুট / আউটপুট ক্রিয়াকলাপের সময় জিআইএল প্রকাশ করে, থ্রেডগুলি নন-ব্লকিং আই / ও অনুকরণের জন্য দরকারী করে তোলে।

গুরুত্বপূর্ণ সতর্কীকরণ: এই বিভ্রান্তিকর হতে পারে যেহেতু বাইট-কোড নির্দেশাবলীর সংখ্যা নেই না একটি প্রোগ্রামে লাইন নম্বর মিলা। এমনকি পাইথন-এ একটি অ্যাসাইনমেন্টও পারমাণবিক নাও হতে পারে, তাই কোনও জিএল-এর সাথে, এমনকি কোনও জিওএল-এর সাথেও পরমাণুভাবে কার্যকর করতে হবে এমন কোনও কোডের ব্লকের জন্য একটি মিউটেক্স লক প্রয়োজনীয় ।

কিউটি থ্রেড

পাইথন যখন কোনও তৃতীয় পক্ষের সংকলিত মডিউলটির নিয়ন্ত্রণ ছাড়ায়, তখন এটি জিআইএলকে মুক্তি দেয়। যেখানে প্রয়োজন সেখানে পারমাণবিকতা নিশ্চিত করা মডিউলটির দায়িত্ব হয়ে যায়। যখন নিয়ন্ত্রণটি ফেরত দেওয়া হয়, পাইথন জিআইএল ব্যবহার করবে। বিভ্রান্তিকর থ্রেডের সাথে মিলিয়ে এটি তৃতীয় পক্ষের লাইব্রেরিগুলি তৈরি করতে পারে। বহিরাগত থ্রেডিং গ্রন্থাগারটি ব্যবহার করা আরও বেশি কঠিন কারণ এটি মডিউল বনাম দোভাষীর হাতে নিয়ন্ত্রণ কোথায় এবং কখন তা নিয়ে অনিশ্চয়তা যুক্ত করে।

কিউটি থ্রেডগুলি মুক্তিপ্রাপ্ত জিআইএল নিয়ে কাজ করে। কিউটি থ্রেডগুলি একই সাথে কিউটি লাইব্রেরি কোড (এবং অন্যান্য সংকলিত মডিউল কোড যা জিআইএল অর্জন করে না) সম্পাদন করতে সক্ষম হয়। তবে, কিউটি থ্রেডের প্রসঙ্গে পাইথন কোডটি কার্যকর করা এখনও জিআইএল অর্জন করে এবং এখন আপনার কোডটি লক করার জন্য আপনাকে দুটি সেট লজিক পরিচালনা করতে হবে ।

শেষ পর্যন্ত, উভয় কিউটি থ্রেড এবং পাইথন থ্রেডগুলি সিস্টেম থ্রেডের চারপাশে মোড়ানো। পাইথন থ্রেডগুলি ব্যবহারের ক্ষেত্রে প্রান্তিকরকম নিরাপদ, যেহেতু পাইথনগুলিতে যে অংশগুলি লিখিত নেই (স্পষ্টতই জিআইএল ব্যবহার করছে) যে কোনও ক্ষেত্রে জিআইএল ব্যবহার করে (যদিও উপরের ক্যাভ্যাটটি এখনও প্রযোজ্য))

অ-ব্লকিং I / O

থ্রেডগুলি আপনার আবেদনে অসাধারণ জটিলতা যুক্ত করে। বিশেষত পাইথন দোভাষী এবং সংকলিত মডিউল কোডের মধ্যে ইতিমধ্যে জটিল ইন্টারঅ্যাকশনটি মোকাবেলা করার সময়। যদিও অনেকে ইভেন্ট-ভিত্তিক প্রোগ্রামিংগুলি অনুসরণ করা কঠিন বলে মনে করেন, ইভেন্ট-ভিত্তিক, নন-ব্লকিং I / O প্রায়শই থ্রেডের তুলনায় যুক্তি দেখাতে খুব কম সমস্যা হয়।

অ্যাসিঙ্ক্রোনাস আই / ও এর সাহায্যে আপনি সর্বদা নিশ্চিত হতে পারেন যে প্রতিটি প্রকাশ্য বর্ণনাকারীর জন্য মৃত্যুদন্ডের পথটি ধারাবাহিক এবং সুশৃঙ্খল। স্পষ্টতই, এমন সমস্যাগুলির সমাধান করা উচিত যেমন যেমন কোনও ওপেন চ্যানেলের উপর নির্ভর করে কোড যখন করানো হয় তখন কী করা উচিত যখন অন্য কোনও ওপেন চ্যানেল ডেটা ফেরত দেয় তখন কল করার ফলাফলের উপর নির্ভর করে।

ইভেন্ট-ভিত্তিক, অ-ব্লকিং আই / ও-র জন্য একটি দুর্দান্ত সমাধান হ'ল নতুন ডিজেল লাইব্রেরি। এটি এই মুহুর্তে লিনাক্সের মধ্যে সীমাবদ্ধ তবে এটি অসাধারণ দ্রুত এবং বেশ মার্জিত।

পাইয়েভেন্ট , বিস্ময়কর লিবার্ট লাইব্রেরির চারপাশে একটি র‌্যাপার শেখার জন্য এটি আপনার সময়ের জন্য উপযুক্ত , যা আপনার সিস্টেমের জন্য দ্রুততম উপলব্ধ পদ্ধতি (সংকলনের সময় নির্ধারিত) ব্যবহার করে ইভেন্ট-ভিত্তিক প্রোগ্রামিংয়ের জন্য একটি প্রাথমিক কাঠামো সরবরাহ করে।


পুনরায় পাকানো ইত্যাদি: আমি একটি তৃতীয় পক্ষের লাইব্রেরি ব্যবহার করি যা প্রকৃত নেটওয়ার্কিং স্টাফ করে; আমি এটির চারপাশে প্যাচিং এড়াতে চাই। তবে আমি এখনও এটি সন্ধান করব, ধন্যবাদ।
বালফা

2
কিছুই আসলে জিআইএলকে বাইপাস করে না। তবে পাইথন I / O অপারেশনের সময় জিআইএল প্রকাশ করে। সংকলিত মডিউলগুলিকে 'হস্তান্তর' করার সময় পাইথন জিআইএলকেও প্রকাশ করে, যা নিজে জিআইএল অর্জন / প্রকাশের জন্য দায়বদ্ধ।
জেফ ওবার 11

2
আপডেটটি ঠিক ভুল। পাইথন কোডটি কিউথ্রেডের চেয়ে পাইথন থ্রেডে ঠিক একইভাবে চলে। আপনি যখন পাইথন কোডটি চালান তখন আপনি জিআইএলকে জানাতে পারবেন (এবং তারপরে পাইথন থ্রেডগুলির মধ্যে সম্পাদন পরিচালনা করে), আপনি যখন সি ++ কোড চালাবেন তখন আপনি এটি প্রকাশ করবেন। কোনও পার্থক্য নেই।
লুকা লালিনস্কি

1
না, মুল বক্তব্যটি আপনি যেভাবে থ্রেডটি তৈরি করেন তা বিবেচনা না করে পাইথন দোভাষীর কোনও যত্ন নেই। এগুলির জন্য সবচেয়ে যত্নশীল হ'ল এটি জিআইএল অর্জন করতে পারে এবং এক্স নির্দেশাবলীর পরে এটি এটিকে মুক্তি / পুনঃনির্ধারণ করতে পারে। আপনি উদাহরণস্বরূপ সি লাইব্রেরি থেকে কলব্যাক তৈরি করতে সিটিপস ব্যবহার করতে পারেন, এটি একটি পৃথক থ্রেডে ডাকা হবে এবং কোডটি ভিন্ন থ্রেড না জেনেও ঠিকঠাক কাজ করবে। থ্রেড মডিউল সম্পর্কে সত্যিই বিশেষ কিছু নেই।
লুকা লালিনস্কি

1
আপনি বলছিলেন যে লক সংক্রান্ত কিউথ্রেড কীভাবে আলাদা এবং কীভাবে "আপনার কোড লক করার জন্য আপনার দুটি সেট লজিক পরিচালনা করতে হবে"। আমি যা বলছি তা হ'ল এটি একেবারেই আলাদা নয়। থ্রেড শুরু করতে আমি টাইপস এবং pthread_create ব্যবহার করতে পারি এবং এটি ঠিক একইভাবে কাজ করবে। পাইথন কোডটি কেবল জিআইএল সম্পর্কে চিন্তা করে না।
লুকা লালিনস্কি

21

এর সুবিধাটি QThreadহ'ল এটি অন্যান্য কিউটি লাইব্রেরির সাথে একীভূত। এটি হ'ল কিউটিতে থ্রেড-সচেতন পদ্ধতিগুলি জানতে হবে যে তারা কোন থ্রেডে চালাচ্ছে এবং থ্রেডগুলির মধ্যে অবজেক্টগুলি স্থানান্তর করতে আপনাকে ব্যবহার করতে হবে QThread। আর একটি দরকারী বৈশিষ্ট্য আপনার নিজের ইভেন্টের লুপটি থ্রেডে চালাচ্ছে।

আপনি যদি কোনও HTTP সার্ভার অ্যাক্সেস করে থাকেন তবে আপনার বিবেচনা করা উচিত QNetworkAccessManager


1
জেফ ওবারের উত্তরে আমি যে মন্তব্য করেছি তা ছাড়াও QNetworkAccessManagerআশাব্যঞ্জক মনে হচ্ছে। ধন্যবাদ।
বালফা

13

আমি পাইটাল্কে কাজ করার সময় আমি নিজেই একই প্রশ্নটি জিজ্ঞাসা করেছি ।

আপনি কিউটি ব্যবহার করছেন, আপনার QThreadকিউটি ফ্রেমওয়ার্ক এবং বিশদভাবে সংকেত / স্লট সিস্টেমটি ব্যবহার করতে সক্ষম হতে হবে।

সংকেত / স্লট ইঞ্জিনের সাহায্যে আপনি একটি থ্রেড থেকে অন্য একটিতে এবং আপনার প্রকল্পের প্রতিটি অংশের সাথে কথা বলতে সক্ষম হবেন।

তদতিরিক্ত, এই পছন্দটি সম্পর্কে খুব কার্য সম্পাদনের প্রশ্ন নেই কারণ উভয়ই একটি সি ++ বাইন্ডিং।

এখানে পাইকিউটি এবং থ্রেডের আমার অভিজ্ঞতা।

আমি আপনাকে ব্যবহার করতে উত্সাহিত করি QThread


9

জেফের কিছু ভাল পয়েন্ট রয়েছে। শুধুমাত্র একটি মূল থ্রেড যে কোনও জিইউআই আপডেট করতে পারে। যদি আপনাকে থ্রেডের মধ্যে থেকে জিইউআই আপডেট করার দরকার হয়, Qt-4 এর সারিযুক্ত সংযোগ সংকেতগুলি থ্রেডের মধ্যে ডেটা প্রেরণ সহজ করে তোলে এবং আপনি কিউথ্রেড ব্যবহার করলে স্বয়ংক্রিয়ভাবে আহ্বান করা হবে; আমি পাইথন থ্রেড ব্যবহার করছি কিনা সেগুলি নিশ্চিত না, যদিও এতে প্যারামিটার যুক্ত করা সহজ connect()


5

আমি আসলেই সুপারিশ করতে পারি না তবে সিপিথন এবং কিউটি থ্রেডের মধ্যে পার্থক্য বর্ণনা করার চেষ্টা করতে পারি।

প্রথমত, সিপিথন থ্রেডগুলি একই সাথে চলবে না, অন্তত পাইথন কোড নয় not হ্যাঁ, তারা প্রতিটি পাইথন থ্রেডের জন্য সিস্টেম থ্রেড তৈরি করে, তবে বর্তমানে কেবল গ্লোবাল ইন্টারপ্রিটার লক থাকা থ্রেডটি চালানোর অনুমতি দেওয়া হয়েছে (সি এক্সটেনশান এবং এফএফআই কোড এটি বাইপাস করতে পারে, তবে পাইথন বাইটকোড কার্যকর করা হয় না, যখন থ্রেড জিআইএল ধারণ করে না)।

অন্যদিকে, আমাদের কিউটি থ্রেড রয়েছে, যা মূলত সিস্টেম থ্রেডগুলির উপর সাধারণ স্তর, গ্লোবাল ইন্টারপ্রিটার লক নেই এবং এইভাবে একযোগে চলতে সক্ষম। আমি নিশ্চিত না যে পাইকিউটি এটির সাথে কীভাবে ডিল করে, তবে আপনার কিউটি থ্রেডগুলি পাইথন কোডটি কল না করলে সেগুলি একই সাথে চালাতে সক্ষম হবে (বিভিন্ন স্ট্রাকচারায় প্রয়োগ করা হতে পারে বিভিন্ন অতিরিক্ত লকগুলি বার করুন)।

অতিরিক্ত জরিমানা-সুরকরণের জন্য, আপনি জিআইএল-এর মালিকানা স্যুইচ করার আগে যে পরিমাণ বাইটকোড নির্দেশাবলী ব্যাখ্যা করা হয়েছে তা সংশোধন করতে পারবেন - নিম্ন মানগুলির অর্থ আরও প্রসঙ্গের স্যুইচিং (এবং সম্ভবত উচ্চতর প্রতিক্রিয়াশীলতা) তবে পৃথক থ্রেডের চেয়ে কম পারফরম্যান্স (প্রসঙ্গের সুইচগুলিতে তাদের ব্যয় হয় - আপনি যদি প্রতি কয়েকটি নির্দেশকে স্যুইচ করার চেষ্টা করুন এটি গতিতে সহায়তা করে না))

আশা করি এটি আপনার সমস্যার সাথে সহায়তা করবে :)


7
এখানে লক্ষ করা জরুরী: পাইকিউটি কিউথ্রেডস গ্লোবাল ইন্টারপ্রেটার লকটি নিয়ে যায়সমস্ত পাইথন কোড জিআইএলকে লক করে এবং পাইকিউটে আপনি যে কোনও কিউথ্রেডগুলি চালনা করেন পাইথন কোডটি চলবে। (যদি সেগুলি না হয় আপনি আসলে পাইকিউটির "পাই" অংশটি ব্যবহার করছেন না :)। আপনি যদি পাইথন কোডটি বহিরাগত সি লাইব্রেরিতে স্থির করতে চান তবে জিআইএল প্রকাশিত হবে, তবে আপনি পাইথন থ্রেড বা কিউটি থ্রেড ব্যবহার না করেই সত্য true
কোয়ার্ক

এটি আসলে আমি জানাতে চেষ্টা করেছিলাম, সমস্ত পাইথন কোড লকটি নেয় তবে সি / সি ++ কোড পৃথক থ্রেডে চলার জন্য এটি
বিবেচ্য নয়

0

আমি পাইথন এবং PyQt থ্রেড মধ্যে সঠিক পার্থক্য মন্তব্য করতে পারেন না, কিন্তু আমি আপনি ব্যবহার করতে চেষ্টা করছেন কি করছেন করে থাকেন QThread, QNetworkAcessManagerএবং কল নিশ্চিত করে QApplication.processEvents()যখন থ্রেড বেঁচে আছে। আপনি যদি সমাধান করার চেষ্টা করছেন জিইউআইয়ের প্রতিক্রিয়া যদি সত্যিই হয় তবে পরবর্তীতে সহায়তা করবে।


1
QNetworkAcessManagerএকটি থ্রেড বা প্রয়োজন হয় না processEvents। এটি অ্যাসিঙ্ক্রোনাস আইও অপারেশন ব্যবহার করে।
লুকা লালিনস্কি

ওফ ... হ্যাঁ, আমি QNetworkAcessManagerএবং এর সংমিশ্রণটি ব্যবহার করছি httplib2। আমার অ্যাসিঙ্ক কোড ব্যবহার করে httplib2
ব্রায়ানজ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.