2012-10-12 19 views
5

Eğer çok işlemcili kullanıyorsanız ve yanlışlıkla creating processes without limit sonlandırırsanız işletim sistemi bundan hoşlanmayacaktır.Çok işlemcili "kaçak hatalar" ın önlenmesi

Bunun olmasını engelleyen basit bir çözüm var mı (örneğin, Python'da veya OS'de toplam işlem sayısını sınırlandırarak)?

Windows kullanıyorum ve böyle bir hata yaptığımda gerçekten çok kötü davranıyor (zor yeniden başlatma gerektiriyor). Öyleyse, uygulamamı ekleyebildiğim/ekleyebildiğim ve bunun olmasını engelleyebildiğim bir kod varsa bunu çok isterim.

+0

Eğer bu bir pencere sorusudur - neden Linux? – tMC

+0

İdeal olarak Linux için bir çözüm ve Windows için bir çözüm istiyorum! Üzgünüm, bu konuda net değildim ... Açıkçası,% 50'lik bir çözüm hala hiçbir şeyden daha iyi değil. – max

cevap

3

Yapabilecekleriniz kısa 'trip-wire' tipi bir modül oluşturmak ve çok işlemcili olarak içe aktarmaktır. Trip-wire modülü, çok işlemli sonsuz bir döngü algıladığında bir istisna oluşturacaktır.

Mine şuna benzer:

#mp_guard.py 
"""tracks invocation by creating an environment variable; if that 
variable exists when next called a loop is in progress""" 

import os 

class Brick(Exception): 
    def __init__(self): 
     Exception.__init__(self, "Your machine just narrowly avoided becoming" 
           " a brick!") 

if 'MP_GUARD' in os.environ: 
    raise Brick 

os.environ['MP_GUARD'] = 'active' 

Ve ana .py dosyası: pencerelerin üzerinde

import mp_guard 
1

Linux'ta, işlem sayısını sınırlamak için (fork bombs'u önlemek için) setrlimit(2) syscall (RLIMIT_NPROC ile) kullanabilirsiniz. Bu syscall, yerleşik ulimit (veya zsh limit) aracılığıyla arayüzlenmiştir. Python'un bu syscall için bazı binding vardır.

Windows altında benzer bir şey olup olmadığını bilmiyorum.

+1

Anlatabildiğim kadarıyla, Windows için hiçbir şey yok ... onlar için berbat :-( – ephemient

+0

Eğer öyleyse, gerçekten de berbat. Windows kapanma moduna geçtiğinde bile, süreçlerin çoğalmasını durduramaz gibi görünüyor. Win 7'nin, kapatmaya çalışırken yeni kullanıcı tarafından oluşturulan süreçleri engellemesinin kolay olacağını düşünün ... – max

+1

Linux bu sorundan çekmiyor. –

1

Eğer python ben bir uzman değilim "bir iş" oluşturabilir, Bu yüzden windows işlerini oluşturmak için herhangi bir bağlayıcı olup olmadığını bilmiyorum. Windows API işlevi CreateJobObject'dur. Bir iş nesnesi, bir dereceye kadar Unix "işlem grubunun" eşdeğeridir. Belirli sınırlamaları hem iş nesnesinde hem de tüm işlemlerde ayrı ayrı uygulayabilirsiniz (örn. Işteki maksimum süreçler). Bir iş nesnesi oluşturabilir, ona işlem sınırı belirleyebilir ve ardından kendi işleminizi iş nesnesine atayabilirsiniz. Ne arıyor olabilir CreateJobObject, SetInformationJobObject + JOBOBJECT_BASIC_LIMIT_INFORMATION + JOB_OBJECT_LIMIT_ACTIVE_PROCESS olduğunu. Tekrar: Bu, Windows API'sıdır, bu işlevlerle ilişkili python'lara ilişkin herhangi bir 'bağlama' olup olmadığından emin değilim.

İlgili konular