Python进程与线程

进程模块——multiprocessing

函数名介绍参数返回值
Process创建一个进程target,args进程对象
start执行进程
join阻塞进程
kill杀死进程
is_alive进程是否存活bool

举例

# coding:utf-8

import time
import os
import multiprocessing


def work_a():
    for i in range(10):
        print(i, 'a', os.getpid())
        time.sleep(1)


def work_b():
    for i in range(10):
        print(i, 'b', os.getpid())
        time.sleep(1)


if __name__ == '__main__':
    start = time.time()
    a_p = multiprocessing.Process(target=work_a)  # 子进程1
    # a_p.start()  # 子进程1 运行
    b_p = multiprocessing.Process(target=work_b)  # 子进程2
    # b_p.start()  # 子进程2 运行

    for p in (a_p, b_p):
        p.start()

    for p in (a_p, b_p):
        p.join()

    for p in (a_p, b_p):
        print(p.is_alive())

    print(time.time() - start)
    print('parent pid is %s' % os.getpid())

进程池的创建

函数名介绍参数返回值
Pool进程池创建Processcount进程池对象
apply_async任务加入进程池(异步)func, args
close关闭进程池
join等待进程池任务结束
# coding:utf-8

import os
import time
import multiprocessing


def work(count):
    print(count, os.getpid())
    time.sleep(5)
    return 'result is %s, pid is %s' % (count, os.getpid())


if __name__ == '__main__':
    pool = multiprocessing.Pool(5)
    results = []
    for i in range(20):
        result = pool.apply_async(func=work, args=(i,))
        results.append(result)

    pool.close()
    pool.join()

    for res in results:
        print(res.get())

进程锁的加锁与解锁

from multiprocessing import Manager
manager = Manager()
lock = manage.Lock()
函数名介绍参数返回值
acquire上锁
release开锁(解锁)
# coding:utf-8

import os
import time
import multiprocessing


def work(count, lock):
    lock.acquire()
    print(count, os.getpid())
    time.sleep(5)
    lock.release()
    return 'result is %s, pid is %s' % (count, os.getpid())


if __name__ == '__main__':
    pool = multiprocessing.Pool(5)
    manger = multiprocessing.Manager()
    lock = manger.Lock()
    results = []
    for i in range(20):
        result = pool.apply_async(func=work, args=(i, lock))
        results.append(result)

    pool.close()
    pool.join()

    # for res in results:
    #     print(res.get())

进程之间的通信

# coding:utf-8

import json
import time
import multiprocessing

class Work(object):
    def __init__(self):
        self.q = q

    def send(self, message):
        if not isinstance(message, str):
            message = json.dumps(message)
        self.q.put(message)

    def send_all(self):
        for i in range(20):
            self.q.put(i)
            time.sleep(1)

    def receive(self):
        while 1:
            result = self.q.get()
            try:
                res = json.loads(result)
            except:
                res = result
            print('recv is %s' % res)


if __name__ == '__main__':
    q = multiprocessing.Queue()
    work = Work(q)
    send = multiprocessing.Process(target=work.send, args=({"name": "zhangsan"}))
    recv = multiprocessing.Process(target=work.receive)
    send_all_p = multiprocessing.Process(target=work.send_all())

    send_all_p.start()
    send.start()
    recv.start()

    send_all_p.join()
    recv.terminate()

线程模块——threading

函数名介绍参数返回值
Thread创建线程target,args线程对象
start启动线程
join阻塞直到线程执行结束
getName获取线程的名字
setName设置线程的名字
is_alive进程是否存活bool
setDaemon守护进程
# coding:utf-8

import json
import time
import random
import threading

lists = ['python', 'django', 'flask',
         'bas5', 'requests'
]

new_lists = []


def work():
    if len(lists) == 0:
        return
    data = random.choice(lists)
    lists.remove(data)
    new_data = '%s_new' % data
    new_lists.append(new_data)


if __name__ == '__main__':
    start = time.time()
    t_list = []
    for i in range(len(lists)):
        t = threading.Thread(target=work)
        t_list.append(t)
        t.start()

    for t in t_list:
        t.join()

    print('old list:', lists)
    print('new list', new_lists, len(new_lists))
    print('new_list len', len(new_lists))
    print('time is %s' % (time.time() - start))

线程池的创建

方法名说明举例
futures.ThreadPoolExecutor创建线程池tpool = ThreadPoolExecutor(max_workers)
submit往线程池中加入任务submit(target, args)
done线程池中的某个线程是否完成了任务done()
result获取当前线程执行任务的结果result()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值