পাইথনে থ্রেড তৈরি করা


177

আমার একটি স্ক্রিপ্ট আছে এবং আমি চাই একটি ফাংশন অন্যটির সাথে একই সময়ে চালানো হোক।

উদাহরণ কোডটি আমি দেখেছি:

import threading

def MyThread (threading.thread):
    # doing something........

def MyThread2 (threading.thread):
    # doing something........

MyThread().start()
MyThread2().start()

এই কাজটি করতে আমার সমস্যা হচ্ছে। আমি ক্লাসের চেয়ে থ্রেডেড ফাংশন ব্যবহার করে এটি পেতে পছন্দ করব।

এটি কার্যকরী স্ক্রিপ্ট:

from threading import Thread

class myClass():

    def help(self):
        os.system('./ssh.py')

    def nope(self):
        a = [1,2,3,4,5,6,67,78]
        for i in a:
            print i
            sleep(1)


if __name__ == "__main__":
    Yep = myClass()
    thread = Thread(target = Yep.help)
    thread2 = Thread(target = Yep.nope)
    thread.start()
    thread2.start()
    thread.join()
    print 'Finished'

উত্তর:


323

Threadএই কাজটি করার জন্য আপনার একটি সাবক্লাস ব্যবহার করার দরকার নেই - কীভাবে নীচের দিকে পোস্ট করছি তার সাধারণ উদাহরণটি একবার দেখুন:

from threading import Thread
from time import sleep

def threaded_function(arg):
    for i in range(arg):
        print("running")
        sleep(1)


if __name__ == "__main__":
    thread = Thread(target = threaded_function, args = (10, ))
    thread.start()
    thread.join()
    print("thread finished...exiting")

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


আমি এই চেষ্টা করেছি। আমি উপরে স্ক্রিপ্ট যোগ করেছি। প্রথম ফাংশনটির পাশাপাশি কীভাবে দ্বিতীয় ফাংশনটি চলতে হবে তা আমাকে বলতে পারেন। ধন্যবাদ
খ্রিস্টসগর্মলি

6
@ ক্রিসিগোমারলি: প্রথম থ্রেড শেষ না হওয়া পর্যন্ত যোগ করুন () ব্লক করুন
ফোগল বার্ড

4
@ ক্রিসিগোমর্লি: উল্লিখিত হিসাবে, আপনি যে থ্রেডটিতে যোগ দিচ্ছেন তা শেষ না হওয়া অবধি ব্লকগুলিতে যোগদান করুন, সুতরাং আপনার ক্ষেত্রে দুটি ফাংশন পাশাপাশি চালানোর লক্ষ্য হিসাবে আপনার দ্বিতীয় ফাংশন দিয়ে একটি দ্বিতীয় থ্রেড শুরু করুন, তারপরে বিকল্পগুলির মধ্যে একটিতে যোগ দিন যদি আপনি তাদের শেষ না হওয়া পর্যন্ত অপেক্ষা করতে চান।
jkp

41
আমি পড়া রাখা exitingযেমন exciting, যা আমি চিন্তা আরো উপযুক্ত যাহাই হউক না কেন ছিল।
চেজ রবার্টস

42

আপনার কোডটিতে কয়েকটি সমস্যা রয়েছে:

def MyThread ( threading.thread ):
  • আপনি কোনও ফাংশন সহ সাবক্লাস করতে পারবেন না; শুধুমাত্র একটি ক্লাস সঙ্গে
  • আপনি যদি একটি সাবক্লাস ব্যবহার করতে যাচ্ছেন তবে আপনি থ্রেডিং চাইবেন h থ্রেড, থ্রেডিং.থ্রেড নয়

আপনি যদি কেবলমাত্র ফাংশন দিয়ে সত্যিই এটি করতে চান তবে আপনার কাছে দুটি বিকল্প রয়েছে:

থ্রেডিং সহ:

import threading
def MyThread1():
    pass
def MyThread2():
    pass

t1 = threading.Thread(target=MyThread1, args=[])
t2 = threading.Thread(target=MyThread2, args=[])
t1.start()
t2.start()

থ্রেড সহ:

import thread
def MyThread1():
    pass
def MyThread2():
    pass

thread.start_new_thread(MyThread1, ())
thread.start_new_thread(MyThread2, ())

থ্রেড.স্টার্ট_ নতুন_থ্রেডের জন্য ডক


2
দ্বিতীয় যুক্তি হতে হবে tuple জন্যthread.start_new_thread(function, args[, kwargs])
venkatvb

13

আমি আরও একটি যোগদান () যোগ করার চেষ্টা করেছি এবং এটি কার্যকর বলে মনে হচ্ছে। এখানে কোড

from threading import Thread
from time import sleep

def function01(arg,name):
    for i in range(arg):
        print(name,'i---->',i,'\n')
        print (name,"arg---->",arg,'\n')
        sleep(1)

def test01():
    thread1 = Thread(target = function01, args = (10,'thread1', ))
    thread1.start()
    thread2 = Thread(target = function01, args = (10,'thread2', ))
    thread2.start()
    thread1.join()
    thread2.join()
    print ("thread finished...exiting")

test01()

3

আপনি কনস্ট্রাক্টরের targetমধ্যে আর্গুমেন্টটি Threadসরাসরি কোনও ফাংশনে পাস করার জন্য ব্যবহার করতে পারেন যা পরিবর্তে ডাকা হয় run


2

আপনি রান () পদ্ধতিটি ওভাররাইড করেছেন? আপনি যদি ওভাররাইড করে থাকেন তবে আপনি __init__কি বেসটি কল করার বিষয়ে নিশ্চিত হন threading.Thread.__init__()?

দুটি থ্রেড শুরু করার পরে, মূল থ্রেডটি কি শিশু থ্রেডগুলিতে অনির্দিষ্টকালের জন্য / অবরুদ্ধ / যোগদান করা চালিয়ে যায় যাতে শিশু থ্রেডগুলি তাদের কাজ শেষ করার আগেই মূল থ্রেডের কার্যকারিতা শেষ না হয়?

এবং অবশেষে, আপনি কি কোনও অপ্রয়োজনীয় ব্যতিক্রম পাচ্ছেন?


কোনও অপরিশোধিত ব্যতিক্রম নেই এবং মূল থ্রেডটি 30 মিনিটের জন্য চালানো উচিত। আমি ওভাররাইড করিনি __init__। রান () দরকার কি তখন? ধন্যবাদ
খ্রিস্টগ্রোমলে

আমি কেবল বুঝতে পেরেছি যে আপনার উদাহরণটি def MyThread ( threading.thread )... আমি ধরে নিয়েছিলাম যে এটি ক্লাস সংজ্ঞা ছিল। আপনি যদি সাবক্লাস থ্রেডিংয়ে যাচ্ছেন th থ্রেডটি এবং থ্রেড অবজেক্টটি target=Noneআরগের সাহায্যে বাদ দিতে বা বাদ দিতে পারেন target, তবে রান () এর একটি প্রয়োগ প্রয়োজন। অন্যথায়, আপনি যদি অন্য থ্রেডে কেবল একটি সাধারণ কাজ চালাতে চান তবে জে.কে.পি. এর উত্তর দেখুন।
জেরেমি ব্রাউন 15

0

পাইথন 3 এ সমান্তরাল কাজগুলি চালু করার সুবিধা রয়েছে । এটি আমাদের কাজকে আরও সহজ করে তোলে।

এটি থ্রেড পুলিং এবং প্রক্রিয়া পুলিংয়ের জন্য রয়েছে

নিম্নলিখিতটি একটি অন্তর্দৃষ্টি দেয়:

থ্রেডপুলএক্সেকটর উদাহরণ

import concurrent.futures
import urllib.request

URLS = ['http://www.foxnews.com/',
        'http://www.cnn.com/',
        'http://europe.wsj.com/',
        'http://www.bbc.co.uk/',
        'http://some-made-up-domain.com/']

# Retrieve a single page and report the URL and contents
def load_url(url, timeout):
    with urllib.request.urlopen(url, timeout=timeout) as conn:
        return conn.read()

# We can use a with statement to ensure threads are cleaned up promptly
with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
    # Start the load operations and mark each future with its URL
    future_to_url = {executor.submit(load_url, url, 60): url for url in URLS}
    for future in concurrent.futures.as_completed(future_to_url):
        url = future_to_url[future]
        try:
            data = future.result()
        except Exception as exc:
            print('%r generated an exception: %s' % (url, exc))
        else:
            print('%r page is %d bytes' % (url, len(data)))

আরেকটি উদাহরণ

import concurrent.futures
import math

PRIMES = [
    112272535095293,
    112582705942171,
    112272535095293,
    115280095190773,
    115797848077099,
    1099726899285419]

def is_prime(n):
    if n % 2 == 0:
        return False

    sqrt_n = int(math.floor(math.sqrt(n)))
    for i in range(3, sqrt_n + 1, 2):
        if n % i == 0:
            return False
    return True

def main():
    with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
        for number, prime in zip(PRIMES, executor.map(is_prime, PRIMES)):
            print('%d is prime: %s' % (number, prime))

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