2019年8月12日(多进程)

1、多进程

多进程
import multiprocessing
import os


def info(title):
    print(title)
    print(__name__)
    print('father', os.getppid())
    print('self', os.getpid())
    print('--------')



if __name__ == "__main__": # 除了创建的子进程和子进程调用函数,其他的都是脚本主进程
    # info('hello')
    # 创建一个子进程调用函数
    P = multiprocessing.Process(target=info,args=('hello python',))
    P.start()
    P.join() # 和多线程一样,也是等待的意思
    print('hello word') # 若没有join则会独立运行

 

# 当进程进行文件读写操作的时候(关键性操作的时候)需要使用锁..
from multiprocessing import Process,RLock
import multiprocessing

def _write(str_,lock):
    print(multiprocessing.current_process().name)
    # 写入文件
    path = '/Users/joker/Desktop/joker.txt'

    # with 会自己帮你关掉
    with lock:
                # 路径   模式a:追加  # 编码模式:utf-8, gbk,gb12128
        with open(path, mode='a',encoding='utf8') as f:
            f.write(str_)
    
if __name__ == "__main__":
    ps = []
    # 创建一个活锁
    lock = RLock()
    for i in range(10):
        p = Process(target=_write,args=('今天天气好晴朗\n',lock))
        p.start()
        ps.append(p)
    
    for i in ps:
        i.join()

 

import multiprocessing


def func(conn):
    conn.send(['Joker is a good man'])
    print('{} 发送了..'.format(multiprocessing.current_process().name))
    print('{} 接受了 {}'.format(multiprocessing.current_process().name,conn.recv()))
    conn.close()

if __name__ == "__main__":
    conn_a,conn_b = multiprocessing.Pipe()
    p1 = multiprocessing.Process(target=func,args=(conn_a,)).start()
    conn_b.send([1, 2, 3, 4, 5, 6, 7])  # 发送数据给conn_a
    print('main',conn_b.recv())

 

 '''
    全局变量不共享
    1809 ['a', 'b', 'c']
    1810 [1, 2, 3]
    '''
  
  # 全局变量不可以进程共享
import multiprocessing
import os
data = []

def List():
    global data
    data.append(1)
    data.append(2)
    data.append(3)
    print('p',os.getpid(),data)


if __name__ == '__main__':
    p = multiprocessing.Process(target=List,args=()).start()  # 子进程
    data.append('a')  # 脚本主进程
    data.append('b')
    data.append('c')
    print('main',os.getpid(),data)

 

import multiprocessing
import time
############################################################################
# https://docs.python.org/zh-cn/3/library/queue.html#queue.Queue.task_done #
############################################################################


# 一定是要一个放,一个取
# maxsize 设置队列的最大长度.
queue = multiprocessing.Queue(maxsize=10)
def func1(queue):
    while 1:
        print('放入..')
        queue.put(100,timeout=3)

def func2(queue):
    while 1:
        time.sleep(3)
        res = queue.get()
        print(res)

if __name__ == "__main__":
    p1 = multiprocessing.Process(target=func1,args=(queue,))
    # p2 = multiprocessing.Process(target=func2,args=(queue,))

    p1.start()
    # p2.start()
    p1.join()
    # p2.join()

 

# 创建一个共享的列表/数组
# 当你有多个进程需要同时操作某一个数组的时候,你就应该搭建一个共享数组Array.
import multiprocessing

def func(m,i):
    m[i] = 10000
 
def func1():
    # Array 是一个对象
    list_ = multiprocessing.Array('i',[1,2,3])
    return list_


if __name__ == "__main__":
    list_ = func1()
    print(list_[:])
    p1 = multiprocessing.Process(target=func,args=(list_,0))
    p2 = multiprocessing.Process(target=func,args=(list_,1))
    p1.start()
    p2.start()
    p1.join()
    p2.join()

    print(list_[:])

 

import multiprocessing


def func(mydict, mylist):
    mydict["胡旺"] = "牛皮"
    mydict["lalal"] = "大美女"
    mylist.append(11)
    mylist.append(22)
    mylist.append(33)


if __name__ == "__main__":
    # with multiprocessing.Manager() as MG:
    #     mydict=MG.dict()
    #     mylist=MG.list(range(5))
    mydict = multiprocessing.Manager().dict()
                                        # [0,1,2,3,4]
    mylist = multiprocessing.Manager().list(range(5))

    p = multiprocessing.Process(target=func, args=(mydict, mylist))
    p.start()
    p.join()

    print(mylist)
    print(mydict)
# print(list(range(5)))  # 很牛逼的list

 

转载于:https://www.cnblogs.com/wangying317/p/11340686.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值