스크립트가 있는데 한 함수가 다른 함수와 동시에 실행되기를 원합니다.
내가 본 예제 코드 :
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 ):
- 함수로 서브 클래 싱 할 수 없습니다. 수업 만
- 만약 당신이 서브 클래스를 사용하려고한다면 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, ())
답변
다른 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()
답변
생성자 에서 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()