파이썬에서 쓰레드 만들기


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

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


나는 이것을 시도했다. 위의 스크립트를 추가했습니다. 두 번째 함수를 첫 번째 함수와 함께 실행하는 방법을 알려주십시오. 감사합니다
chrissygormley

6
@ chrissygormley : 첫 번째 스레드가 끝날 때까지 join () 블록.
FogleBird

4
@ chrissygormley : 언급 한 바와 같이 결합 할 스레드가 완료 될 때까지 블록을 결합하십시오. 따라서 두 번째 함수를 대상으로 두 번째 함수로 두 번째 스레드를 시작하여 두 함수를 나란히 실행 한 다음 선택적으로 두 가지 함수를 결합하십시오 당신은 그들이 끝날 때까지 기다립니다.
jkp

41
나는 독서 유지 exitingexciting좀 더 적절한 어쨌든라고 생각한다.
체이스 로버츠

42

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

def MyThread ( threading.thread ):
  • 함수로 서브 클래 싱 할 수 없습니다. 수업 만
  • 만약 당신이 서브 클래스를 사용하려고한다면 threading.thread가 아니라 threading을 원할 것이다.

기능만으로이 작업을 수행하려면 다음 두 가지 옵션이 있습니다.

스레딩으로 :

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에 대한 문서입니다 .


2
두 번째 인수는해야 튜플을 위해thread.start_new_thread(function, args[, kwargs])
venkatvb

13

다른 join ()을 추가하려고 시도했지만 작동하는 것 같습니다. 여기 코드가 있습니다

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

run () 메소드를 대체 했습니까? 오버라이드 한 경우 __init__베이스를 호출 threading.Thread.__init__()했습니까?

두 스레드를 시작한 후 기본 스레드가 하위 스레드에서 무한정 작동 / 차단 / 결합하여 하위 스레드가 작업을 완료하기 전에 기본 스레드 실행이 끝나지 않습니까?

마지막으로 처리되지 않은 예외가 발생합니까?


처리되지 않은 예외는 없으며 주 스레드는 30 분 동안 실행해야합니다. 나는 무시하지 않았다 __init__. 그렇다면 run ()이 필요합니까? 감사합니다
chrissygormley

방금 당신의 예가 def MyThread ( threading.thread )... 그것이 클래스 정의라고 가정했습니다. threading.thread를 서브 클래 싱 target=None하고 targetarg를 사용하여 스레드 객체를 초기화 하거나 생략하는 경우 run () 구현이 필요합니다. 그렇지 않으면 다른 스레드에서 간단한 작업을 실행하려면 jkp의 답변을 참조하십시오.
Jeremy Brown

0

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()
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.