python은 프로세스나 스레드의 개수를 어떻게 제어합니까

배경
일상적인 개발에서 병발 장면을 만나기 어렵고 병발 장면은 유량 제어를 해야 한다. 즉, 병발 과정이나 라인의 총량을 제어해야 한다.오늘은 두 가지 자주 사용하는 제어 스레드 개수의 방법을 간단하게 총결한다.
방법1: 프로세스 풀/스레드 풀
다음 예제demo에서 보듯이 크기가 4인 프로세스 탱크를 만들고 5개의 프로세스를 만들고 시작합니다

from multiprocessing import Pool
import os, time, random


def long_time_task(name):
  print('Run task %s (%s)...' % (name, os.getpid()))
  start = time.time()
  time.sleep(random.random() * 3)
  end = time.time()
  print('Task %s runs %0.2f seconds.' % (name, (end - start)))


if __name__ == '__main__':
  print('Parent process %s.' % os.getpid())
  p = Pool(4)
  for i in range(5):
    p.apply_async(long_time_task, args=(i,))
  print('Waiting for all subprocesses done...')
  p.close()
  p.join()
  print('All subprocesses done.')
실행 결과는 다음과 같습니다. 다섯 번째 프로세스는 연못의 프로세스가 완성된 후에야 시작됩니다.

Run task 0 (32952)...
Run task 1 (32951)...
Run task 2 (32953)...
Run task 3 (32954)...
Task 2 runs 0.68 seconds.
Run task 4 (32953)...
Task 1 runs 1.41 seconds.
Task 0 runs 1.44 seconds.
Task 4 runs 2.15 seconds.
Task 3 runs 2.98 seconds.
All subprocesses done.
방법 2:queue
queue 모듈은 대기열입니다. 특히 여러 개의 스레드 간에 안전하게 교환되는 다중 스레드 프로그램에서 정보를 처리하기에 적합합니다.다음 데모는 queue를 통해 라인의 병렬 개수를 제한하는 방법을 보여 줍니다.

import threading
import queue
import time
import random
import os

maxThreads = 4


class Store(threading.Thread):
  def __init__(self, q):
    threading.Thread.__init__(self)
    self.queue = q
    # self.store = store

  def run(self):
    try:
      print('Run task (%s)...' % (os.getpid()))
      start = time.time()
      time.sleep(random.random() * 3)
      end = time.time()
      t = threading.currentThread()
      #  ID
      print('Thread id : %d' % t.ident)
      print('Thread name : %s' % t.getName())
      print('Task runs %0.2f seconds.' % (end - start))
    except Exception as e:
      print(e)
    finally:
      self.queue.get()
      self.queue.task_done()


def main():
  q = queue.Queue(maxThreads)
  for s in range(6):
    q.put(s)
    t = Store(q)
    t.start()
  q.join()
  print('over')


if __name__ == '__main__':
  main()
실행 결과는 다음과 같습니다.

Run task (33259)...
Run task (33259)...
Run task (33259)...
Run task (33259)...
Thread id : 123145444999168
Thread name : Thread-13
Task runs 0.04 seconds.
Run task (33259)...
Thread id : 123145394630656
Thread name : Thread-10
Task runs 1.02 seconds.
Run task (33259)...
Thread id : 123145428209664
Thread name : Thread-12
Task runs 1.20 seconds.
Thread id : 123145394630656
Thread name : Thread-17
Task runs 0.68 seconds.
Thread id : 123145444999168
Thread name : Thread-14
Task runs 1.79 seconds.
Thread id : 123145411420160
Thread name : Thread-11
Task runs 2.96 seconds.
over
이상은python이 프로세스나 라인의 개수를 어떻게 제어하는지에 대한 상세한 내용입니다. 더 많은python 제어 프로세스나 라인에 대한 자료는 저희 다른 관련 글에 주목하십시오!

좋은 웹페이지 즐겨찾기