2010-01-12 7 views
41
import subprocess 

def my_function(x): 
    return x + 100 

output = subprocess.Popen(my_function, 1) #I would like to pass the function object and its arguments 
print output 
#desired output: 101 

Yalnızca ayrı komut dosyalarını kullanarak alt işlemlerin açılmasıyla ilgili belgeleri buldum. İşlev nesnelerini nasıl geçeceğini, hatta işlev kodunu iletmenin kolay bir yolunu bilen var mı?Bir alt işlemde, iş parçacığı olmadan veya ayrı bir dosya/komut dosyası yazmadan işlevi çalıştırmak mümkün mü?

+1

[Çok işlemcili] (http://docs.python.org/3.1/library/multiprocessing.html) modülünü aradığınızı düşünüyorum. –

cevap

65

seni daha çoklu işlem modülü gibi bir şey arıyorsanız düşünüyorum:

http://docs.python.org/library/multiprocessing.html#the-process-class

altişlem modülü yumurtlama süreçleri için ve onların giriş/çıkışına sahip şeyler yapıyor - değil fonksiyonlarını çalıştırmak için.

from multiprocessing import Process, Queue 

def my_function(q, x): 
    q.put(x + 100) 

if __name__ == '__main__': 
    queue = Queue() 
    p = Process(target=my_function, args=(queue, 1)) 
    p.start() 
    p.join() # this blocks until the process terminates 
    result = queue.get() 
    print result 
+13

'processify' dekoratörünü kısayol olarak kullanabilirsiniz: https://gist.github.com/2311116 – schlamar

+1

Bu işlemin Python yorumlayıcısını ve tüm alt yapısını çevrelediğini mi sanıyorum? – Jens

+0

İşte python 3'te çalışan ve jeneratör işlevlerini destekleyen bir processify çataldır. https://gist.github.com/stuaxo/889db016e51264581b50 –

14

Sen os.fork() olarak, standart Unix fork sistem çağrısını kullanabilirsiniz: Burada

Kodunuzun multiprocessing versiyonudur. fork(), aynı komut dosyasının çalıştığı yeni bir işlem oluşturur. Yeni süreçte, geri dönecek, eski süreçte ise yeni sürecin süreç kimliğini döndürecektir. Daha yüksek seviyeli kütüphanesi için

child_pid = os.fork() 
if child_pid == 0: 
    print "New proc" 
else: 
    print "Old proc" 

, o multiprocessing modül var, birden fazla işlemi kullanırken için taşınabilir bir soyutlama sağlayan çoklu işlem desteği sağlar. Her iki teknik için kısa bir giriş ile birlikte, IBM DeveloperWorks, Multiprocessing with Python hakkında bir makale var.

import threading 
import time 

def blocker(): 
    while True: 
     print "Oh, sorry, am I in the way?" 
     time.sleep(1) 

t = threading.Thread(name='child procs', target=blocker) 
t.start() 

# Prove that we passed through the blocking call 
print "No, that's okay" 

de kullanabilirsiniz: çoklu işlem hakkında

+0

Merak ediyorum; neden düşüş Cevabımda yanlış bir şey var mı? –

+0

Çoklu işlem sadece fork() etrafında daha yüksek düzeyli bir paketleyici değildir, çoklu platform çoklu işlem araç takımıdır (unix'te çatal kullanır). Hangisi önemlidir, çünkü bunun anlamı Windows (Windows) üzerinde çalışır, fork() ise olmaz. Düzenleme: Ve bu düşüşün sebebiydi, daha sonra muhtemelen buna değmeyeceğine karar vermeme rağmen. Gerçi geri almak için çok geç. Düzenleme2: Ya da, platformun çapraz olmadığı durumlarda önerilen fork() nedenidir. –

+1

@Devin, eğer isterseniz, her zaman yaptığınız bir düşüşü geri alabilirsiniz. –

3

Brian McKenna'nýn yukarıdaki sonrası bu örnek, başlamanıza yardımcı olacaktır, gerçekten yararlı olmakla birlikte, dişli yol gitmek istiyorsa (tabanlı işlemeye karşı) İpliği hemen arka plana getirmek için setDaemon(True) özelliği.

İlgili konular