Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is it possible to run function in a subprocess without threading or writing a separate file/script.

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 

I have only found documentation on opening subprocesses using separate scripts. Does anyone know how to pass function objects or even an easy way to pass function code?

like image 343
wroscoe Avatar asked Jan 12 '10 03:01

wroscoe


People also ask

What is the difference between subprocess run and subprocess Popen?

The main difference is that subprocess. run() executes a command and waits for it to finish, while with subprocess. Popen you can continue doing your stuff while the process finishes and then just repeatedly call Popen. communicate() yourself to pass and receive data to your process.

Is subprocess run thread safe?

subprocess. Process class is not thread safe.

Does subprocess Popen run in parallel?

We can use subprocess module to create multiple child processes and they are run in parallel.


2 Answers

I think you're looking for something more like the multiprocessing module:

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

The subprocess module is for spawning processes and doing things with their input/output - not for running functions.

Here is a multiprocessing version of your code:

from multiprocessing import Process, Queue  # must be a global function     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 
like image 107
Brian McKenna Avatar answered Sep 27 '22 00:09

Brian McKenna


You can use the standard Unix fork system call, as os.fork(). fork() will create a new process, with the same script running. In the new process, it will return 0, while in the old process it will return the process ID of the new process.

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

For a higher level library, that provides multiprocessing support that provides a portable abstraction for using multiple processes, there's the multiprocessing module. There's an article on IBM DeveloperWorks, Multiprocessing with Python, with a brief introduction to both techniques.

like image 45
Brian Campbell Avatar answered Sep 23 '22 00:09

Brian Campbell