source

python에서 스레드 만들기

gigabyte 2023. 2. 1. 21:51
반응형

python에서 스레드 만들기

저는 스크립트를 가지고 있는데 하나의 기능을 다른 기능과 동시에 실행하고 싶습니다.

지금까지 살펴본 코드 예는 다음과 같습니다.

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'

서브클래스를 사용할 필요가 없습니다.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")

여기서는 스레드 모듈을 사용하여 일반 함수를 대상으로 호출하는 스레드를 작성하는 방법을 보여 줍니다.스레드 생성자에서 필요한 인수를 전달할 수 있는 방법을 볼 수 있습니다.

코드에는 몇 가지 문제가 있습니다.

def MyThread ( threading.thread ):
  • 함수로 서브클래스를 할 수 없습니다.클래스만 있습니다.
  • 서브클래스를 사용할 경우 스레드를 사용해야 합니다.스레드, 스레드 없음.

기능만 사용하여 이 작업을 수행하려면 다음 두 가지 옵션을 사용할 수 있습니다.

스레드 포함:

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, ())

thread.start_new_thread 문서

다른 조인()을 추가하려고 했는데 효과가 있었던 것 같습니다.여기 코드가 있습니다.

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()

를 사용할 수 있습니다.target의 의론Thread대신 호출되는 함수를 직접 전달하기 위한 생성자run.

run() 메서드를 덮어썼습니까?오버라이드한 경우__init__기지에 연락은 확실히 했습니까?threading.Thread.__init__()?

두 개의 스레드를 시작한 후 메인 스레드는 하위 스레드 작업을 완료하기 전에 메인 스레드 실행이 종료되지 않도록 하위 스레드에서 무기한 작업/블록/조인을 계속 수행합니까?

마지막으로 처리되지 않은 예외가 있습니까?

Python 3에는 병렬 태스크 실행 기능이 있습니다.이것은 우리의 일을 더 쉽게 해준다.

스레드 풀링 및 프로세스 풀링에 사용됩니다.

다음은 통찰력을 제공합니다.

ThreadPoolExecutor의 예시

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()

를 사용하여 멀티스레드 프로세스를 구현하는 간단한 방법threading

같은 코드 스니펫

import threading

#function which takes some time to process 
def say(i):
    time.sleep(1)
    print(i)

threads = []
for i in range(10):
    
    thread = threading.Thread(target=say, args=(i,))

    thread.start()
    threads.append(thread)

#wait for all threads to complete before main program exits 
for thread in threads:
    thread.join()

언급URL : https://stackoverflow.com/questions/2905965/creating-threads-in-python

반응형