当前位置:主页 > 软件编程 > Python代码 >

python 包之 multiprocessing 多进程

时间:2022-07-19 10:18:27 | 栏目:Python代码 | 点击:

一、创建一个进程

from multiprocessing import Process

def func(s):
print(s)

if __name__ == '__main__':
p = Process(target=func, args=('autofelix', ))
p.start()
p.join()

二、创建多个进程

from multiprocessing import Process

def func(s):
print(s)

if __name__ == '__main__':
process = [
Process(target=func, args=('1', ))
Process(target=func, args=('2', ))
]

[p.start() for p in process]
[p.join() for p in process]

三、管道pipe进行进程间通信

Pipe(duplex=True):表示双工通信,也就是双向的,既可以接受也可以发送数据,默认为True

Pipe(duplex=False):表示单工通信,也就是单向的,只能进行接受或者发送数据

from multiprocessing import Process, Pipe

def func(conn):
print('send a list object ot other side...')
# 从管道对象的一端发送数据对象
conn.send(['33', 44, None])
conn.close()

if __name__ == '__main__':
# 默认创建一个双工管道对象,返回的两个对象代表管道的两端,
# 双工表示两端的对象都可以发送和接收数据,但是需要注意,
# 需要避免多个进程或线程从一端同时读或写数据
parent_conn, child_conn = Pipe()
p = Process(target=func, args=(child_conn, ))
p.start()
# 从管道的另一端接收数据对象
print(parent_conn.recv())
p.join()

四、队列Queue进行进程间通信

from multiprocessing import Process, Queue

def func(q):
  print('put a list object to queue...')
  # 向Queue对象中添加一个对象
  q.put(['33', 44, None])

if __name__ == '__main__':
  # 创建一个队列
  q = Queue()
  p = Process(target=func, args=(q, ))
  p.start()
  # 从Queue对象中获取一个对象
  print(q.get())
  p.join()
-----------------------------------
?著作权归作者所有:来自51CTO博客作者autofelix的原创作品,谢绝转载,否则将追究法律责任
python 包之 multiprocessing 多进程教程
https://blog.51cto.com/autofelix/5166197

五、进程间同步

from multiprocessing import Process, Lock

def func(lc, num):
# 使用锁保证以下代码同一时间只有一个进程在执行
lc.acquire()
print('process num: ', num)
lc.release()

if __name__ == '__main__':
lock = Lock()
for i in range(5):
Process(target=func, args=(lock, i)).start()

六、进程间共享数据

from multiprocessing import Process, Value, Array

def func(n, a):
n.value = 3.333
for i in range(len(a)):
a[i] = -a[i]

if __name__ == '__main__':
# 第一个参数d表示数据类型'double'双精度浮点类型
num = Value('d', 0.0)
# 第一个参数i表示数据类型'integer'整型
arr = Array('i', range(6))
p = Process(target=func, args=(num, arr))
p.start()
p.join()
print(num.value)
print(arr[:])

七、进程池

from multiprocessing import Pool
import time

def f(x):
return x * x

if __name__ == '__main__':
with Pool(processes=4) as pool: # start 4 worker processes
# 在进程池中开启一个新的进程并执行 f 函数
result = pool.apply_async(f, (10,)) # evaluate "f(10)" asynchronously in a single process
print(result.get(timeout=1)) # prints "100" unless your computer is *very* slow

# map会一直阻塞当前进程直到运行完可迭代对象中的所有元素,并返回结果。
print(pool.map(f, range(10))) # prints "[0, 1, 4,..., 81]"

# imap是map方法的延迟执行版本,对于比较消耗内存的迭代,建议使用这个方法,
it = pool.imap(f, range(10))
print(next(it)) # prints "0"
print(next(it)) # prints "1"
print(it.next(timeout=1)) # prints "4" unless your computer is *very* slow

result = pool.apply_async(time.sleep, (10,))
print(result.get(timeout=1)) # raises multiprocessing.TimeoutError

您可能感兴趣的文章:

相关文章