Python多进程

转自:http://www.cnblogs.com/cnkai/p/7514815.html

Python中提供了函数和类来实现多进程

创建多进程

使用函数方式
import multiprocessing
import time

def worker(sec):
    time.sleep(sec)
    print('这是进程的名字', multiprocessing.current_process().name)
    time.sleep(sec)

if __name__ == '__main__':

    print('这是主进程:', multiprocessing.current_process().name)
    
    s_time = time.time()
    p1 = multiprocessing.Process(target=worker, args=(2,))
    p2 = multiprocessing.Process(target=worker, args=(2,))

    p1.start()
    p2.start()

    p1.join()
    p2.join()

    print('主进程结束', multiprocessing.current_process().name)
    print('一共用时', time.time()-s_time)

自己测试结果为:

为什么没有输出“这是进程的名字……”,下面出现一样的问题。

使用类方式

import multiprocessing
import time

class Worker(multiprocessing.Process):

    def __init__(self, sec):
        super(Worker, self).__init__()
        self.sec = sec

    def run(self):
        time.sleep(self.sec)
        print('这是进程的名字', multiprocessing.current_process().name)
        time.sleep(self.sec)


if __name__ == '__main__':
    print('主进程开始:', multiprocessing.current_process().name)
    s_time = time.time()

    pro_list = []
    for i in range(4):
        worker = Worker(2)
        pro_list.append(worker)

    for p in pro_list:
        p.start()

    for p in pro_list:
        p.join()

    print('主进程结束', multiprocessing.current_process().name)
    print('一共用时', time.time()-s_time)

使用以上两种方式创建多进程时,join()方法与多线程效果相同,多线程设置守护线程的命令是

t.setDaemon(True), 而多进程设置守护进程的命令是p.daemon = True

进程锁Lock()

进程锁可以避免因为多个进程访问共享资源而发生冲突。

  • 不使用进程锁
import multiprocessing
import sys

def worker(f):
    f = open(f, 'w')
    n = 100000
    while n > 1:
        f.write("The number is %s \n" %n)
        n -= 1
    f.close()


if __name__ == "__main__":
    f = "file.txt"
    p1 = multiprocessing.Process(target=worker, args=(f,))
    p2 = multiprocessing.Process(target=worker, args=(f,))

    p1.start()
    p2.start()

但是,自己用Python3.6实验是正确的,


可以看到,文件在写入的时候并没有按照我们想要的顺序。

  • 使用进程锁
import multiprocessing
import sys

def worker(lock, f):

    lock.acquire()
    fs = open(f, 'a+')
    n = 100
    while n > 1:
        fs.write("The number is %d\n"%n)
        n -= 1
    fs.close()
    lock.release()

if __name__ == "__main__":

    lock = multiprocessing.Lock()
    f = "file.txt"
    p1 = multiprocessing.Process(target=worker, args=(lock, f))
    p2 = multiprocessing.Process(target=worker, args=(lock, f))
    p1.start()
    p2.start()

Semaphore

Semaphore控制访问共享资源的数量

import multiprocessing
import time

def worker(s, i):
    s.acquire()
    print("进程%s acquire" %multiprocessing.current_process().name);
    time.sleep(i)
    print('进程%s 正在访问资源' %multiprocessing.current_process().name)
    print("进程%s release" %multiprocessing.current_process().name);
    s.release()

if __name__ == "__main__":
    s = multiprocessing.Semaphore(2)

    pro_list = []
    for i in range(5):
        p = multiprocessing.Process(target = worker, args=(s, i))
        pro_list.append(p)

    for p in pro_list:
        p.start()

自己实验打印不出来东西,不知道为什么?

由于我们设置了访问某个资源的最大进程数是2,所以最多只能有两个进程可以同时访问该资源,当某一个进程释放之后,其他的进程才可以访问,以此来保证不超过最大访问数。

进程池Pool


import multiprocessing
from multiprocessing import Process,Pool
import time

def run(sec):
    time.sleep(sec)
    print('进程%s正在执行!' % multiprocessing.current_process().name)
    time.sleep(sec)

if __name__ == '__main__':
    print('主进程开始了 ' ,multiprocessing.current_process().name)
    s_time = time.time()
    p = Pool(5)      # 最大并发进程数
    for i in range(10):
        p.apply_async(run, args=(2,))

    p.close()    # 关闭进程池
    p.join()

    print('主进程结束', multiprocessing.current_process().name)
    print('一共用时: ', time.time()-s_time)



只是打印出来这个不知道为什?

只是打印出来这个不知道为什?
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值