多工才有多程序和執行緒:
執行緒是最小的執行單元,而程序由至少乙個執行緒組成。如何排程程序和執行緒,完全由作業系統決定,程式自己不能決定什麼時候執行,執行多長時間。
多程序和多執行緒的程式涉及到同步、資料共享的問題,編寫起來更複雜。
子程序永遠返回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')
很多時候,子程序並不是自身,而是乙個外部程序。我們建立了子程序後,還需要控制子程序的輸入和輸出。
subprocess
模組可以讓我們非常方便地啟動乙個子程序,然後控制其輸入和輸出。
如果子程序還需要輸入,則可以通過communicate()
方法輸入:
import subprocess5. 程序間通訊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)
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
多執行緒:
多執行緒程式設計,模型複雜,容易發生衝突,必須用鎖加以隔離,同時,又要小心死鎖的發生。
lock = threading.lock()
t = threading.thread(targat = func,args=(n,))
python直譯器由於設計時有gil全域性鎖,導致了多執行緒無法利用多核。多執行緒的併發在python中就是乙個美麗的夢。
python 多執行緒 和 多程序
單執行緒例子 usr bin python coding utf 8 name danxiancheng.py import time import threading def loop num,sec print loop s start num,time.strftime y m d h m s...
python多執行緒和多程序
pool 感謝多執行緒和多程序最大的不同在於,多程序中,同乙個變數,各自有乙份拷貝存在於每個程序中,互不影響 而多執行緒中,所有變數都由所有執行緒共享,所以,任何乙個變數都可以被任何乙個執行緒修改,因此,執行緒之間共享資料最大的危險在於多個執行緒同時改乙個變數,把內容給改亂了。python中,多執行...
多程序和多執行緒python
coding utf8 import threading import time class mop floor threading.thread def init self super mop floor,self init def run self print 我要拖地了 time.sleep ...