পাইথনে পটভূমি ফাংশন


89

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

উত্তর:


130

এরকম কিছু করুন:

def function_that_downloads(my_args):
    # do some long download here

তারপরে ইনলাইন করুন, এর মতো কিছু করুন:

import threading
def my_inline_function(some_args):
    # do some stuff
    download_thread = threading.Thread(target=function_that_downloads, name="Downloader", args=some_args)
    download_thread.start()
    # continue doing stuff

কল করে অন্যান্য জিনিসগুলিতে যাওয়ার আগে থ্রেডটি শেষ হয়েছে কিনা তা আপনি পরীক্ষা করতে চাইতে পারেন download_thread.isAlive()


থ্রেড বন্ধ না হওয়া পর্যন্ত দোভাষী খোলা থাকে। (উদাহরণ import threading, time; wait=lambda: time.sleep(2); t=threading.Thread(target=wait); t.start(); print('end'))। আমি আশা করছিলাম "ব্যাকগ্রাউন্ড" এছাড়াও বিচ্ছিন্নভাবে প্রচ্ছন্ন।
থারস্মমনার

4
@ থারস্মমনার থ্রেডগুলি একই প্রক্রিয়ার মধ্যে রয়েছে। যদি আপনি একটি নতুন প্রক্রিয়া ডিম করতে খুঁজছি করছেন, তাহলে আপনি দেখব করতে চাইবেন subprocessবা multiprocessingপরিবর্তে পাইথন মডিউল।
টরেলটিউইল্ডার

@ টরেলটিউইল্ডার আমি ব্যাকগ্রাউন্ডে একটি ফাংশন পরিচালনা করতে চাই তবে আমার কিছু রিসোর্স সীমাবদ্ধতা রয়েছে এবং আমি যতবার ইচ্ছা ফাংশনটি চালাতে পারি না এবং ফাংশনের অতিরিক্ত ফাঁসির সন্ধান করতে চাই। আমার কীভাবে করা উচিত সে সম্পর্কে আপনার কোনও ধারণা আছে? আমি এখানে আমার প্রশ্ন আছে । আপনি কি আমার প্রশ্নটি একবার দেখে নিতে পারেন? যেকোনো সাহায্যই অসাধারণ!
আমির

4
আপনি যদি একাধিক প্যারামিটার চান: ডাউনলোড_থ্রেড = থ্রেডিং h থ্রেড (টার্গেট = ফাংশন_ট্যাট_ডাউনলোডস, আরগস = (ভেরিয়েবল 1, ভেরিয়েবল 2, ভ্যারিয়েবল
এন

একাধিক আরগ পাস করার পদ্ধতি যেমন পদ্ধতিটি হয় add(a,b)এবং সেই পদ্ধতির ফেরতের মূল্য পান
মাইফি উল আসাদ

7

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

বলেছে ক্রিয়া সম্পাদন করতে, আমি ইভেন্ট অবজেক্ট এবং কুই মডিউলটি ব্যবহার করব

তবে, একটি সাধারণ threading.Threadবাস্তবায়ন ব্যবহার করে আপনি কী করতে পারেন তার একটি তাত্পর্যপূর্ণ এবং মলিন প্রদর্শন নীচে দেখা যাবে:

import os
import threading
import time
import urllib2


class ImageDownloader(threading.Thread):

    def __init__(self, function_that_downloads):
        threading.Thread.__init__(self)
        self.runnable = function_that_downloads
        self.daemon = True

    def run(self):
        self.runnable()


def downloads():
    with open('somefile.html', 'w+') as f:
        try:
            f.write(urllib2.urlopen('http://google.com').read())
        except urllib2.HTTPError:
            f.write('sorry no dice')


print 'hi there user'
print 'how are you today?'
thread = ImageDownloader(downloads)
thread.start()
while not os.path.exists('somefile.html'):
    print 'i am executing but the thread has started to download'
    time.sleep(1)

print 'look ma, thread is not alive: ', thread.is_alive()

আমি উপরের মতো করে পোল না করে এটি সম্ভবত বোধগম্য হবে। কোন ক্ষেত্রে, আমি কোডটিতে এই পরিবর্তন করব:

import os
import threading
import time
import urllib2


class ImageDownloader(threading.Thread):

    def __init__(self, function_that_downloads):
        threading.Thread.__init__(self)
        self.runnable = function_that_downloads

    def run(self):
        self.runnable()


def downloads():
    with open('somefile.html', 'w+') as f:
        try:
            f.write(urllib2.urlopen('http://google.com').read())
        except urllib2.HTTPError:
            f.write('sorry no dice')


print 'hi there user'
print 'how are you today?'
thread = ImageDownloader(downloads)
thread.start()
# show message
thread.join()
# display image

লক্ষ্য করুন যে এখানে কোনও ডেমন পতাকা সেট করা নেই।


4

আমি এই ধরণের জিনিসটির জন্য উত্স ব্যবহার করতে পছন্দ করি :

import gevent
from gevent import monkey; monkey.patch_all()

greenlet = gevent.spawn( function_to_download_image )
display_message()
# ... perhaps interaction with the user here

# this will wait for the operation to complete (optional)
greenlet.join()
# alternatively if the image display is no longer important, this will abort it:
#greenlet.kill()

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

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


এই লাইন উদ্দেশ্য কী আছে: from gevent import monkey; monkey.patch_all()?
nz_21

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