1. 程式人生 > >python多進程和多線程

python多進程和多線程

done 創建 組成 需要 getpid ret nat set write

多任務才有多進程和線程:

線程是最小的執行單元,而進程由至少一個線程組成。如何調度進程和線程,完全由操作系統決定,程序自己不能決定什麽時候執行,執行多長時間。

多進程和多線程的程序涉及到同步、數據共享的問題,編寫起來更復雜。

子進程永遠返回0,而父進程返回子進程的ID。這樣做的理由是,一個父進程可以fork出很多子進程,所以,父進程要記下每個子進程的ID,而子進程只需要調用getppid()就可以拿到父進程的ID。

1.fock()只在linux/unix下可以使用 os.fork()

2.multiprocessing:

from multiprocessing import Process
import os
def run_proc(name):
print(‘The child process No. is %s(%s)‘ % (name,os.getpid()))
if __name__==‘__main__‘:
print(‘Parent process %s ‘ % os.getpid())
p = Process(target=run_proc,args=(‘test‘,))
p.start()
p.join()
print(‘END‘)

3.Pool

如果要啟動大量的子進程,可以用進程池的方式批量創建子進程:

#Pool
from multiprocessing import Pool
import os,time,random
def long_time_task(name):
print(‘Task %d(%s) is running...‘ % (name,os.getpid()))
start = time.time()
time.sleep(random.random() * 3)
stop = time.time()
print(‘Task %d runs %.3f seconds!‘ % (name,(stop-start)) )

if __name__ ==‘__main__‘:
print(‘Parent process %s ‘ % os.getpid())
pool = Pool(4)
for i in range(8):
pool.apply_async(long_time_task,args=(i,))

print(‘Waiting all subprocesses done....‘)
pool.close()
pool.join()
print(‘All subprocesses done.‘)

4.子進程

很多時候,子進程並不是自身,而是一個外部進程。我們創建了子進程後,還需要控制子進程的輸入和輸出。

subprocess模塊可以讓我們非常方便地啟動一個子進程,然後控制其輸入和輸出。

import subprocess
print(‘$ nslookup www.baidu.com‘)
o = subprocess.call([‘nslookup‘,‘www.baidu.com‘])
print(‘exit code:‘,o)

如果子進程還需要輸入,則可以通過communicate()方法輸入:

import subprocess

print(‘$ nslookup‘)
p = subprocess.Popen([‘nslookup‘], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
output, err = p.communicate(b‘set q=mx\npython.org\nexit\n‘)
print(output.decode(‘GBK‘))
print(‘Exit code:‘, p.returncode)

5. 進程間通信

from multiprocessing import Process,Queue
import os,time,random

# def write(q):
# print(‘Process to Write:%d‘ % os.getpid())
# for value in [‘A‘,‘B‘,‘C‘]:
# print(‘Put %s to queue...‘ % value)
# q.put(value)
# time.sleep(random.random())

def write(q):
print(‘Process to write: %s‘ % os.getpid())
for value in [‘A‘, ‘B‘, ‘C‘]:
print(‘Put %s to queue...‘ % value)
q.put(value)
time.sleep(random.random())


# def read(q):
# print(‘Process to Read:%d‘ % os.getpid())
# while True:
# value = q.get(True)
# print(‘Get %s from queue!‘ %value)

def read(q):
print(‘Process to read: %s‘ % os.getpid())
while True:
value = q.get(True)
print(‘Get %s from queue.‘ % value)


if __name__==‘__main__‘:
q = Queue()
pw = Process(target=write, args=(q,))
pr = Process(target=read, args=(q,))

pw.start()
# dddddddddddd
pr.start()

pw.join()

pr.terminate()

小結:

1.linux和unix 可以使用fock()調用多進程

2.多操作系統通用的,可以用multiprocessing模塊中的Process(target =函數,args(name,)),Pool,subprocess

3.進程間通信可以通過Queue、Pipes

python多進程和多線程