본문 바로가기
프로그래밍

[Python] 멀티 프로세스,멀티 쓰레드 예제코드

by dladbru 2018. 7. 16.
import struct
import time
import threading
import pycurl
import re
import os

from StringIO import StringIO
from multiprocessing import Process,current_process,Pool,freeze_support


up= lambda x:struct.unpack("<L",x) #Big Endian
p=lambda x:struct.pack(">L",x) #Little Endian

class KMS(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)

    def run(self):
        print "Call Thread"


def mp(number):
    #proc_name = current_process().name
    result = number * 2
    proc = os.getpid()
    print('{0} doubled to {1} by process id: {2}'.format( number, result, proc))


def pycurl_test():
    try:
        buffer = StringIO()
        c = pycurl.Curl()
        c.setopt(c.URL, 'http://vuln.kr')
        c.setopt(c.POST, True)
        c.setopt(c.SSL_VERIFYPEER, False)
        c.setopt(c.WRITEFUNCTION,buffer.write)
        #c.setopt(c.HTTPHEADER, [])
        
        c.perform()
        body = buffer.getvalue()      
        
    
    except Exception as e:
        pass
    finally:
        if c!=None:
            c.close()
        if buffer!=None:
            buffer.close()

    return 200,body

if __name__ == '__main__': 
    freeze_support() # for MultiProcess without Fork Function 


    try:
        a=KMS() #MultiThread Code
        a.start()


        numbers = [5, 10, 15, 20, 25] #MultiProcess Code
        procs = []
        for index, number in enumerate(numbers):
            proc = Process(target=mp, args=(number,))
            procs.append(proc)
            proc.start() 

        for proc in procs:
            proc.join()
        
        print pycurl_test() # PyCurl Code

        
        raise Exception("Something Exception")
    except Exception as e:
        print "Exception: {0}".format(e)


MultiProcess , MultiThread 예제코드 및 PyCurl 에 대해서 싣혀있는 코드를 올린다.


1. pycurl

PyCurl은 "pip install pycurl" 로 설치할 수 있다. PyCurl 에 대해서 말하자면 requests 모듈보다는 가독성도 좋고 사용하기 편리하지만! PyCurl이 속도가 더 빠르므로 필요시 사용할 수 있다. 가독성이 문제라면 관련된 모듈을 만들어서 사용하자.



2. multiprocessing

 if __name__ == '__main__': 

    freeze_support()

위를 정의해주고 사용해야한다. IDLE로는 멀티프로세스가 구동되지도 않는 버그가 있는것같은데, 잘 모르겠다.

하나하나 찾아볼 용기가 나지않는다....T^T

알아낸것은 프로세스가 생성되면서  if __name__ ~~ 바깥에 있는 코드는 생성된 수대로 동작한다는 점이다.  

설명이 어렵지만 직접사용해보면 안다 ;;



3. multithread

파이썬은 아쉽게도 multithread를 지원하지 않는다. 

이 모듈은 그렇게 보여주게 하는셈인것으로 볼 수 있다.

컨텍스트 스위칭(cpu가 작업 요리갓다 저리갓다하는거) 가 많이 일어나서 굳이 사용해야할까 싶지만

네트워크와 관련된 작업을 할때에는 네트워크 지연시간동안 다른 작업을 처리할 수 있으므로

좋은 선택으로 보인다.




위 3개에 대한 코드로 정리해놓고 필요시에 가져다 사용할 생각이다 끗.




<figure 0. 위 코드 실행화면 ㅋ>


반응형

댓글