python 线程进程协程(二)

1.进程的基本使用:

from multiprocessing import Process


class MyProcess(Process):
    def run(self):
        print('name:{0}--pid:{1}'.format(self.name, self.pid))


if __name__ == '__main__':
    p = MyProcess()
    p.start()
    p.join()

控制台输出:

name:MyProcess-1--pid:45612

2.进程池:

from multiprocessing import Process, current_process, Pool


def func(num):
    pid = current_process().pid  
    # 进程获得pid和name可以直接用multiprocessing中的current_process
    name = current_process().name
    print('num:{0},pid:{1},name:{2}'.format(num, pid, name))


if __name__ == '__main__':
    pool = Pool(4)
    n_list = range(100)
    for n in n_list:
        # pool.apply_async(func, args=(n,))
        pool.apply(func, args=(n,))

    pool.close()
    pool.join()

如果使用异步apply_async,或者与开启的线程数相比,任务数比较少,使用的进程数就不一定有指定的那么多,可能只有1或2个进程在跑任务

3.通过Queue进行通信:进程之间是相互隔离的,要实现进程间通信,multiprocessing提供了队列和管道的方式,管道不自动加锁,此处使用的是队列方式:
(一方通过put写入数据,一方通过get获得数据)

from multiprocessing import Process,current_process,Queue


class WriteProcess(Process):
    def __init__(self, q, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.q = q

    def run(self):
        context = [
            '第一行内容',
            '第二行内容',
            '第三行内容'
        ]
        for each in context:
            print('写入内容:{0},名字:{1}'.format(each, current_process().name))
            self.q.put(each)


class ReadProcess(Process):
    def __init__(self, q, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.q = q

    def run(self):
        while True:
            print(self.q.get())


if __name__ == '__main__':
    q = Queue()  # 通过q来通信
    w = WriteProcess(q)
    r = ReadProcess(q)
    w.start()
    r.start()
    w.join()
    r.terminate()  
    # 由于读的代码写的是死循环,且没有再有子进程了,
    # 所以使用terminate终止程序

4.进程锁
同样在class的定义中传入lock,加锁并释放锁,或者使用with操作:

from multiprocessing import Process,current_process,Queue,Lock
import time


class WriteProcess(Process):
    def __init__(self, lock, num, *args, **kwargs):
        super().__init__(*args, **kwargs)
        # self.q = q
        self.lock = lock
        self.num = num

    def run(self):
        with self.lock:
            for i in range(10):
                with open('test2.txt', 'w', encoding='utf-8') as f:
                    context = '写入内容:i:{0}, pid:{1}, num:{2}'.format(i, self.pid,self.num)
                    f.write(context)
                    f.write('\n')
                    print(context)

            time.sleep(2)


if __name__ == '__main__':
    lock = Lock()

    for i in range(5):
        w1 = WriteProcess(lock,i)
        w1.start()  # 此处不用join,否则一条进程结束后才会起第二条进程

控制台部分输出:(每个进程都会先执行完10次的打印,才会到下一个)

写入内容:i:0, pid:65248, num:0
写入内容:i:1, pid:65248, num:0
写入内容:i:2, pid:65248, num:0
写入内容:i:3, pid:65248, num:0
写入内容:i:4, pid:65248, num:0
写入内容:i:5, pid:65248, num:0
写入内容:i:6, pid:65248, num:0
写入内容:i:7, pid:65248, num:0
写入内容:i:8, pid:65248, num:0
写入内容:i:9, pid:65248, num:0

猜你喜欢

转载自blog.csdn.net/qq_43523725/article/details/108335780