Python 多线程示例
介绍
多进程间通信,可以使用 multiprocessing
模块提供了 Queue
,Pipes
os.fork()
创建子进程,如果返回值为0,则是子进程,否则是父进程
- 由于 windows 平台不支持 fork 方法,所以python提供
multiprocessing
模块来跨平台多进程,multiprocessing
模块封装了 fork()
调用,multiprocessing
模块提供Process类代表进程
- 创建子进程时,只需要传入一个执行函数和函数的参数,创建一个Process实例,用
start()
方法启动
- 如果要启动大量的子进程,可以用进程池的方式批量创建子进程,
from multiprocessing import Pool
multiprocessing.Pipe()
一般用于进程或线程间的通信,创建管道时返回两个连接对象,代表管道的两端
- 类似的
os.pipe()
,但它主要用来创建两个文件描述符,一个读,一个写,单向通信
示例
multiprocessing.Pipe
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from multiprocessing import Process, Pipe
def send(pipe):
pipe.send('i am something ...')
print(f'send got: {pipe.recv()}')
pipe.close()
def recv(pipe):
pipe.send(dict(name='xianbin', age=18))
print(f'recv got: {pipe.recv()}')
pipe.close()
if __name__ == '__main__':
(con1, con2) = Pipe()
sender = Process(target=send, name='send', args=(con1,))
sender.start()
recver = Process(target=recv, name='talk', args=(con2,))
recver.start()
multiprocessing.Pool
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import time
import random
from multiprocessing import Pool
def sub_task(name):
spid = os.getpid()
print('run sub task name is {}, sub pid is {}...'.format(name, spid))
start = time.time()
time.sleep(random.random() * 3)
end = time.time()
print('sub task %s runs %0.2f seconds.' % (name, (end - start)))
return spid
if __name__=='__main__':
print('main process %s.' % os.getpid())
p = Pool(4)
results = []
for i in range(10):
r = p.apply_async(sub_task, args=(i,))
results.append(r)
print('Waiting for all subprocesses done...')
for r in results:
print("-- result {}".format(r.get()))
p.close()
p.join()
print('All sub proceess done.')