프로세스를 실행하는 멀티 프로세싱 얻을 수 없다, 나는 확실하지 않다 _run()
기능. 모든 프로세스가 생성 된 것으로 보입니다. 그러나 단일 프로세스로 처리하는 것보다 더 빠르지는 않습니다. 기본적으로 run_**_normalizers()
함수에서 발생하는 일은 데이터베이스 (SQLAlchemy)의 큐 테이블에서 읽은 다음 몇 가지 HTTP 요청을 한 다음 노멀 라이저의 '파이프 라인'을 실행하여 데이터를 수정 한 다음 다시 데이터베이스에 저장하는 것입니다. 나는 쓰레드가 '무겁고'병렬 처리에 자주 사용되는 JVM 토지에서 갈 것입니다. 다중 처리 모듈이 파이썬의 GIL 한계를 극복해야한다고 생각했기 때문에 약간 혼란 스럽습니다.는 아래의 코드가 동시에 실행하지 않는 것 동시에
6
A
답변
3
내 다중 처리 문제가 수정되어 실제로 스레드가 전환되었습니다. 실제로 생각했던 것을 고쳐 썼는지 확신 할 수 없습니다. 모든 것을 다시 설계하고 작업자와 작업자를 만들었지 만, 지금은 비행하지 않는 것들이 있습니다. 여기에 내가 무슨 짓을했는지의 기초이다 :
import abc
from Queue import Empty, Queue
from threading import Thread
class AbstractTask(object):
"""
The base task
"""
__metaclass__ = abc.ABCMeta
@abc.abstractmethod
def run_task(self):
pass
class TaskRunner(object):
def __init__(self, queue_size, num_threads=1, stop_on_exception=False):
super(TaskRunner, self).__init__()
self.queue = Queue(queue_size)
self.execute_tasks = True
self.stop_on_exception = stop_on_exception
# create a worker
def _worker():
while self.execute_tasks:
# get a task
task = None
try:
task = self.queue.get(False, 1)
except Empty:
continue
# execute the task
failed = True
try:
task.run_task()
failed = False
finally:
if failed and self.stop_on_exception:
print('Stopping due to exception')
self.execute_tasks = False
self.queue.task_done()
# start threads
for i in range(0, int(num_threads)):
t = Thread(target=_worker)
t.daemon = True
t.start()
def add_task(self, task, block=True, timeout=None):
"""
Adds a task
"""
if not self.execute_tasks:
raise Exception('TaskRunner is not accepting tasks')
self.queue.put(task, block, timeout)
def wait_for_tasks(self):
"""
Waits for tasks to complete
"""
if not self.execute_tasks:
raise Exception('TaskRunner is not accepting tasks')
self.queue.join()
내가 모두) (wait_for_tasks를 호출 한 후 TaskRunner를 만들고 (그 중 수천)에 작업을 추가하고있다. 그래서 분명히 다시 아키텍처에서 제가했던 다른 문제가 수정되었습니다. 이상한.
1
여전히 멀티 프로세싱 솔루션을 찾고 있다면, 먼저 근로자의 풀을 사용하는 방법을 확인 할 수 있습니다, 당신은 자신에 NUM_THREADS 프로세스를 관리 할 필요가 없습니다 것입니다 : http://docs.python.org/2/library/multiprocessing.html#using-a-pool-of-workers
그리고 둔화 문제에 대해 config 객체를 _run 함수의 인수로 전달하려고 시도한 적이 있습니까? 나는 이것이 내부적으로 변화를 일으킬 지 여부를 알지 못하지만 그것이 무엇인가를 바꿀 수 있다고 생각합니다.
관련 문제
- 1. 동시에 소리내는 것 안드로이드
- 2. 는 동시에 ID
- 3. 레일 (4)는 동시에
- 4. 동시에 arduino를 읽고 쓰는 것
- 5. 두 가지 방법을 동기화하고 동시에 실행하지 마십시오
- 6. 동시에 I 활성화/동시에 JComponent의 전체 행을 비활성화 할 것
- 7. 두 페이지에서 동일한 페이지를 동시에 실행하지 않는 브라우저
- 8. 동시에
- 9. 동시에
- 10. 이 스레드 코드가 동시에 실행되지 않는 이유는 무엇입니까?
- 11. 동시에 데이터를 MySQL에 동시에 삽입하는 빠른 방법
- 12. 여기에 문서와 파이프 라인을 동시에 사용하는 것
- 13. 동시에
- 14. 동시에
- 15. 동시에
- 16. 는 동시에 엔티티 프레임 워크
- 17. OpenMP : std :: map 동시에 쓰는 것
- 18. 동시에 웹뷰를 클릭하십시오. 그리고 청취자를 동시에 클릭하십시오.
- 19. .NET에서 동시에 콘솔에서 읽고 쓰는 것.
- 20. PHP가 동시에 파일에서 읽고 쓰는 것
- 21. 동시에 구조체의 다른 필드를 업데이트하는 것 - 안전합니까?
- 22. 다른 클래스를 실행하는 법 ..... 동시에 시작하는 것
- 23. 이미지를 동시에 읽고 쓰는 것 처리
- 24. MySQL이 동시에 하나의 테이블에 읽고 쓰는 것
- 25. 어떻게 선언하고 나는 다음과 같은 코드가 동시에
- 26. 모든 .. 내 WPF보기에 이런 코드가 동시에 WPF
- 27. 더 동시에
- 28. 동시에 처리되지 않는 여러 SOAP 요청
- 29. jQuery 애니메이션이 아니라 동시에?
- 30. 두 아약스가 동시에 작동하지 않는 호출 (Heroku가)
다중 처리 모듈은 스레드가 아닌 프로세스를 사용합니다. 따라서 GIL의 영향을받지 않습니다. –
코드를 테스트했으며 필수 기술은 정상입니다. 나는 'config' 사전이 많이 사용된다면 공유 된'config'에 대해 확신 할 수 없다. 프로세서가 병목 현상이 아닐 수도 있습니다. –
필자는 워크 스테이션에서만 8GB 16GB RAM의 Linux를 실행했습니다. 1 또는 1, 8 또는 16 프로세스를 사용하면 아무런 변화가 없으며 시스템 리소스도 정상입니다. –