2015-07-27 19 views
11

Tôi đang chạy Django trên một máy chủ Ubuntu với nginx và gunicorn. Tôi đang cố gắng để làm một số multiprocessing đó là làm việc trên máy địa phương của tôi nhưng treo cho đến khi công nhân gunicorn lần trên máy chủ của tôi.Python đa xử lý Pool treo trên máy chủ ubuntu

cpu_count = int(multiprocessing.cpu_count()) 
pool = Pool(processes = cpu_count) 
result = pool.map_async(apiSimulAvail, rate_ranges) 
result.wait() 

...do some more stuff once all processes return 

Nó treo tại pool = Pool(processes = cpu_count). Tôi không nhận được bất kỳ lỗi nào, nhân viên gunicorn chỉ ra ngoài và khởi động lại.

Bất kỳ dấu hiệu nào về lý do tại sao điều này xảy ra và/hoặc cách tôi có thể giải quyết được đánh giá cao. Cảm ơn.

+0

Bạn có bắt đầu bất kỳ chủ đề nào trước khi bạn bắt đầu các quy trình này không? –

+0

Không có trong chế độ xem đó. – apardes

+0

Ý bạn là "chế độ xem đó" là gì? Nếu một quá trình bị treo, nó có thể là do nó thừa kế trạng thái đồng bộ hóa xấu từ một bậc cha mẹ, hoặc cha mẹ hoặc ông bà ... quá trình. Cách tốt nhất, có thể duy nhất, để đảm bảo điều này không bao giờ có thể xảy ra là không bao giờ bắt đầu các quy trình sau khi bất kỳ chủ đề nào đã được bắt đầu. –

Trả lời

0

Thay đổi

pool = Pool(processes = cpu_count) 

để

pool = Pool(cpu_count) 

này giả định rằng bạn đã nhập Pool từ đa xử nếu không bạn sẽ cần phải làm

multiprocessing.Pool(cpu_count) 
+0

Đánh giá cao đề xuất nhưng điều này dẫn đến cùng một vấn đề. Chạy trên máy cục bộ của tôi nhưng treo trên máy chủ của tôi. – apardes

+0

Bạn có phiên bản python giống nhau trên cả hai máy không? – russOnXMaps

+0

Không, máy cục bộ của tôi có 2.7.5 trong khi máy chủ có 2.7.6. Khi tôi xem qua ghi chú phát hành cho 2.7.6, có vẻ như tất cả sửa lỗi và tôi không thấy bất kỳ điều gì cho biết rằng nó đã tạo ra một vấn đề mới. – apardes

3

Đây dường như là một biến thể trên Using python's Multiprocessing makes response hang on gunicorn vì vậy có thể đây là một bản dupe.

Điều đó có nghĩa là bạn phải sử dụng đa xử lý (MP)? Bạn thực sự có thể được phục vụ tốt hơn nuôi điều này ra một cái gì đó như Celery. MP có thể bị giết với nhân viên gunicorn khi nó chết vì nó sở hữu quy trình MP. Tùy thuộc vào cấu hình máy chủ, điều đó có thể xảy ra khá thường xuyên. Nếu bạn có một số công việc hoạt động rất dài, bạn vẫn có thể trang bị cho Celery, nó chỉ là cấu hình một chút.

+0

Django và Gunicorn không phù hợp cho kết nối lâu dài, vì vậy +1 trên gợi ý Celery. Nếu nhiệm vụ là dài, nó sẽ không chặn kết nối (và nên được thực hiện ở nơi khác). Nếu nhiệm vụ là ngắn ... thì tại sao phải bận tâm với đa xử lý? – MariusSiuram

1

Bạn đang sử dụng một số nhân viên Gyncorn không đồng bộ? Nếu vậy, hãy thử nhân viên đồng bộ hóa mặc định và xem liệu bạn có thể tạo lại sự cố hay không.

Nếu sự cố chỉ có thể được sao chép khi sử dụng công nhân không đồng bộ, bạn nên đảm bảo rằng mô-đun multiprocessing được vá chính xác.

+0

Tôi không chắc tôi có câu trả lời của bạn. Bạn có ý nghĩa gì khi vá mô-đun đa xử lý? –

+0

Có vẻ như nó liên quan đến gevent, mà tôi đã sử dụng như một lớp nhân viên cho gunicorn. Loại bỏ việc khắc phục sự cố treo ít nhất. Bất kỳ ý tưởng làm thế nào để có được nó làm việc với gevent? –

Các vấn đề liên quan