Python multiprocess vs multithread

  1. python GIL (Global Interprinter Lock)

    • 참고
    • 하나의 파이썬 인터프리터에서는 하나의 작업만 실행한다
    • GIL 회피 방법
      • multiprocess 를 사용한다 == 하나의 interpreter 를 실행하여 여럿의 프로세서를 구동한다
      • 구현 단에서, I/O bound 한 부분과 CPU bound한 부분을 나누는 것
      • GIL이 없는 Jython 이나 IronPython을 이용
  2. python multiprocess example

    • multiprocessing 패키지 소개
    • 샘플 테스트 코드

      from multiprocessing import Pool
      from datetime import datetime
      import random
      import time
      
      read_file = open("/Users/mr.sense/Dev/python/test/readfile.txt", 'r') // read 10000 lines
      write_file = open("/Users/mr.sense/Dev/python/test/writefile_multiprocess.txt", 'a')
      
      lines = read_file.readlines()
      read_list = []
      return_list = []
      
      for line in lines:
        line = line.replace('\n','')
        read_list.append(line)
      read_file.close()
      
      # sleep method
      def append_file(msg):
        sleep_time = random.randrange(1,10)
        time.sleep(sleep_time)
        write_file.write(msg+', sleep: '+str(sleep_time)+'\n')
        return msg
      
      # initialize pool
      pool = Pool(processes=1000) # start 1000 worker processes
      
      start = datetime.now()
      print 'start: '+str(start)
      
      # get result process
      for i in pool.imap_unordered(append_file, read_list):
        return_list.append(i)
      
      end = datetime.now()
      print 'end: ' + str(end)
      
      # get time
      print end - start
      
  3. python multithread

    • concurrent 패키지 설치 및 활용
    • 샘플코드

      from datetime import datetime
      import concurrent.futures
      import random
      import time
      
      read_file = open("/Users/mr.sense/Dev/python/test/readfile.txt", 'r') // read 10000 lines
      write_file = open("/Users/mr.sense/Dev/python/test/writefile_multithread.txt", 'a')
      
      lines = read_file.readlines()
      read_list = []
      return_list = []
      
      for line in lines:
        line = line.replace('\n','')
        read_list.append(line)
      read_file.close()
      
      def append_file(msg):
        sleep_time = random.randrange(1,10)
        time.sleep(sleep_time)
        write_file.write(msg+', sleep: '+str(sleep_time)+'\n')
        return msg
      
      start = datetime.now()
      print 'start: '+str(start)
      
      with concurrent.futures.ThreadPoolExecutor(max_workers=1000) as exe:
        write_result = {exe.submit(append_file, line): line for line in read_list}
        for future in concurrent.futures.as_completed(write_result):
            line = write_result[future]
            try:
                data = future.result()
            except Exception as exp:
                print("%r generated an exception: %s" % (line, exp))
      
        end = datetime.now()
        print 'end: ' + str(end)
        print end - start


'개발 > python' 카테고리의 다른 글

Robot framework + Seleium -- (1)  (0) 2018.09.09
python - opencv 를 이용한 이미지 처리  (0) 2018.08.25
django mysql rest api project  (0) 2018.03.11
Django 프로젝트에서 batch job 돌리기  (0) 2018.01.23
Django 프로젝트  (0) 2017.11.29
Posted by 감각적신사
,

React 튜토리얼

개발 2018. 4. 15. 14:40

React 튜토리얼

  1. 개발 환경

    • centos 7.0 (CentOS Linux release 7.4.1708 (Core))
  2. React 설치하기

    • npm 설치:
      [centos@centos ~]$ sudo yum install npm
      ...
      [centos@centos ~]$ npm -v
      3.10.10
      
    • create-react-app 설치
      [centos@centos ~]$ sudo npm install -g create-react-app
      ...
      [centos@centos ~]$ create-react-app --version
      1.5.2
      
      • facebook 공식 그룹 밑에 있으며 react 를 쉽게 사용할 수 있도록 지원해주는 툴 이다
  3. React App 만들기

    • 명령어: create-react-app {{ WEB_APPLICATION_NAME }}
    • 명령어 한줄로 web application 생성이 가능하다

      [centos@centos node]$ create-react-app webapp
      
      Creating a new React app in /home/centos/node/webapp.
      
      Installing packages. This might take a couple of minutes.
      Installing react, react-dom, and react-scripts...
      
      [..................] | normalizeTree: sill install loadCurrentTree
      ...
      
  4. React App 의 패키지 설명

     {{ WEB_APPLICATION_NAME }}
      ㄴ README.md
      ㄴ package.json
      ㄴ node_modules   # react 관련 모듈을 설치하면 이곳에 추가가 된다
      ㄴ public                    # index.html 이 있으며 JS, css 를 추가할때 index.html 에 선언해도 된다
      ㄴ src                          # App.js , App.css 등 react 모듈들을 정의하고 호출하는데 사용
    
    • web application 을 만들고 필요한 추가 패키기를 설치할 때에는 {{ WEB_APPLICATION_NAME 설치 경로}} 에서 npm install 을 한다
      • example:
        [centos@centos webapp]$ pwd
        /home/centos/node/webapp
        [centos@centos webapp]$ npm i react-axios
        [centos@centos webapp]$ npm install react-bootstrap-table --save
        
  5. React App 실행하기

    • node.js 를 통해 간단하게 web server 를 띄울 수 있다
    • 기본적으로 localost:3000 으로 뜨게 되며 외부에서는 접근할 수 없다

      [centos@centos webapp]$ pwd
      /home/centos/node/webapp
      [centos@centos webapp]$ npm start
      ...
      
      Compiled successfully!
      
      You can now view webapp in the browser.
      
      Local:            http://localhost:3000/
      On Your Network:  http://10.0.2.15:3000/
      
      Note that the development build is not optimized.
      To create a production build, use npm run build.
      
  6. 추가 설정사항

    • 외부 IP 를 통해 접근하도록 수정 (listen 0.0.0.0 )
      • {{ WEB_APPLICATION_PATH }}/config/webpack.config.dev.js 수정하기
        module.exports = {
        devtool: 'eval',
        entry: [
          require.resolve('webpack-dev-server/client') + '?http://0.0.0.0:8081',
          require.resolve('webpack/hot/dev-server'),
          path.join(srcPath, 'index')
        ],
        
      • {{ WEB_APPLICATION_PATH }}/scripts/start.js 수정하기
        new WebpackDevServer(compiler, {
        historyApiFallback: true,
        hot: true, // Note: only CSS is currently hot reloaded
        publicPath: config.output.publicPath,
        quiet: true,
        }).listen(3000, '0.0.0.0', function (err, result) {
        
    • 외부 통신을 위한 패키지 설치
    • table 을 만들기 위한 패키지 설치
    • chart 를 그리기 위한 패키지 설치


'개발' 카테고리의 다른 글

ELK + grafana 구축  (0) 2019.01.08
성공적인 Git 브랜치 모델  (0) 2018.10.18
vi 사용하기  (0) 2018.02.08
React 의 특징  (0) 2017.12.20
Git 입문  (0) 2017.12.17
Posted by 감각적신사
,
  1. settings.py 설정

    • mysql 데이터베이스에 사용할 app model 의 initial.py 를 생성한다
    • $ python manage.py makemigrations
      
    • mysql 데이터베이스에 app model table 을 생성한다
    • $ python manage.py migrate
      
      # Database 설정
      DATABASES = {
        # 기본으로 default 의 database 명을 받아 DB migration 을 하게 된다
        'default': {
            'ENGINE': 'django.db.backends.mysql',  # mysql db 를 사용한다
            'NAME': 'database1',                   # database 명
            'USER': 'testuser',                    # 사용자 id
            'PASSWORD': 'testpasswd',              # 사용자 password
            'HOST': 'localhost',                   # ip address
            'PORT': '3306',                        # port
        },
        # 멀티 데이터베이스를 사용하게 될 경우, setting
        'database2': {                             # database 명을 따라간다
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'database2',
            'USER': 'testuser',
            'PASSWORD': 'testpasswd',
            'HOST': 'localhost',
            'PORT': '3306',
        }
      }
      
      # 라우터를 통해 앱 별로 사용할 데이터 베이스를 선택하도록 한다
      DATABASE_ROUTERS = [
        # 프로젝트명.python패키지.python파일명.python클래스
        'django_multi_databases.MultiDatabasesRouter.Router',
      ]
      
  2. Router.py (선택사항)

    • 멀티 데이터베이스 사용시, default 를 사용하지 않을 app 에 대해서만
    • $ python manage.py migrate {app_name} --database={database_name}
      
      class Router(object):
        app_dictionary = {
            'app1' : 'default',
            'app2' : 'database2',
        }
      
        def db_for_read(self, model, **hints):
            return self.app_dictionary[model._meta.app_label];
      
        def db_for_write(self, model, **hints):
            return self.app_dictionary[model._meta.app_label];
      
        def allow_migrate(self, db, app_label, model_name=None, **hints):
            return True
      
  3. models.py

    • mysql 맵핑 object 생성

      # -*- coding: utf-8 -*-
      from __future__ import unicode_literals
      
      from django.db import models
      from django.utils import timezone
      
      class DB1Model(models.Model):
        # 기본적으로 primary 를 선언하지 않으면 id 라는 auto increments 컬럼이 생성된다
        title = models.CharField(max_length=255)
        content = models.TextField()
        likes = models.BigAutoField()
        lastModified = models.DateTimeField(default=timezone.now)
      
  4. Serializer.py

    • DB model 과 django 프레임워크 의 object 를 연결

      class DB1ModelSerializer(serializers.ModelSerializer):
      
        class Meta:
            model = DB1Model
            fields = ('id', 'title', 'content', 'likes, 'lastModified')
      
  5. views.py

    • django 프레임워크 에서 CRUD 하는 로직 생성

      class DB1ModelListCreateAPIView(generics.ListCreateAPIView):
        http_method_names = ['get', 'post']
      
        queryset = DB1Model.objects.all()
        serializer_class = serializers.DB1ModelSerializer
      
      class DB1ModelRetrieveUpdateDestroyAPIView(generics.RetrieveUpdateDestroyAPIView):
        http_method_names = ['get', 'put', 'delete']
        serializer_class = serializers.DB1ModelSerializer
      
        def get_object(self):
            queryset = self.filter_queryset(self.get_queryset())
            filter_kwargs = {'id': self.kwargs['id']}
            model_instance = generics.get_object_or_404(queryset, **filter_kwargs)
            return model_instance
      
  6. urls.py

    • CRUD 동작 과 RESTful API 와 연결

      url(r'^/v1/dbmodel/$', views.DB1ModelListCreateAPIView.as_view(), name="api-dbmodel-lc"),
      url(r'^/v1/dbmodel/(?P<id>[^/]+)/$', views.DB1ModelRetrieveUpdateDestroyAPIView.as_view(), name="api-dbmodel-rud"),


Posted by 감각적신사
,