Python基础之九进程和线程

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014360817/article/details/54844752
import os
print('Process (%s) start...' % os.getpid())
pid = os.fork()
if pid == 0:
    print('I an child process (%s) and my parent is %s' % (os.getpid(), os.getpid()))
else:
    print('I (%s) just created a child process (%s).' % (os.getpid(), pid))

'''
    multiprocessing
'''
from multiprocessing import Process
import os

def run_proc(name):
    print(('Run child process %s (%s)...' % (name, os.getpid())))

if __name__ == '__main__':
    print('Parent process %s.' % os.getpid())
    #创建子进程时,只需要传入一个执行函数和函数的参数,创建一个Process实例,用start()方法启动,这样比fork()简单
    p = Process(target=run_proc, args=('test',))
    print('Child process will start')
    p.start()#启动进程
    p.join()#等待子进程结束后再继续往下运行,通常用于进程间的通病
    print('Child process end.')
'''
    Pool
        如果需要启动大量子进程,可以用进程池的方式批量创建子进程
'''

from multiprocessing import Pool
import os, time, random

def long_time_task(name):
    print('Run task %s (%s)...' % (name, os.getpid()))
    start = time.time()
    time.sleep(random.random() * 3)
    end = time.time()
    print('Task %s runs %0.2f seconds.' % (name, (end - start)))

if __name__ == '__main__':
    print('Parent process %s.' % os.getpid())
    p = Pool(4)
    for i in range(5):
        p.apply_async(long_time_task, args=(i, ))
    print('Wating for all subprocesses done...')
    p.close()
    p.join()
    print('All subprocesses done.')

'''
    子进程
'''
import subprocess
print('$ nslookup www.python.org')
r = subprocess.call(['nslookup', 'www.python.org'])
print('Exit code:', r)

'''
    进程间通信
'''
from multiprocessing import Process, Queue
import os, time, random

#写进程执行代码
def write(q):
    print('Process to write: %s' % os.getpid())
    for value in ['A', 'B', 'C']:
        print('Put %s to queue...' % value)
        q.put(value)
        time.sleep(random.random())

#读进程执行的代码
def read(q):
    print('Process to read: %s' % os.getpid())
    while True:
        value = q.get(True)
        print('Get %s from queue.' % value)

if __name__ == '__main__':
    #父进程创建Queue,并传递给各个子进程
    q = Queue()
    pw = Process(target=write, args= (q,))
    pr = Process(target=read, args= (q,))
    #启动子进程pw,写入
    pw.start()
    #启动子进程pr,读取
    pr.start()
    #等待pw结束
    pw.join()
    #pr进程里面是死循环,无法等待其结束,只能强制执行
    pr.terminate()

'''
    多线程
        多任务可以有多个进程完成, 也可以由一个进程内的多线程完成
'''

import time, threading


print('>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>以下是多线程执行代码')
#新线程执行的代码
def loop():
    print('thread %s is runing...' % threading.current_thread().name)
    n = 0
    while n < 5:
        n = n + 1
        print('thread %s >>> %s' % (threading.current_thread().name, n))
        time.sleep(1)
    print('thread %s ended.' % threading.current_thread().name)

print('thread %s is runing...' % threading.current_thread().name)
t = threading.Thread(target=loop, name='LoopThread')
t.start()
t.join()
print('thread %s ended.' % threading.current_thread().name)

'''
    Lock
        多线程和多进程最大的不同在于,多进程中,同一个变量各自有一份拷贝存在于每个进程中,互不影响,
        而多线程中,所有变量都由所有线程共享,所有,任何一个变量都可以被任何一个线程修改,
        因此,线程之间共享数据最大危险在于多个线程同时修改一个变量

'''
blance = 0
lock = threading.Lock()

def run_thread(n):
    for i in range(100000):
        #现获取锁
        lock.acquire()
        try:
            pass
            #修改something
        finally:
            pass
            #改完释放锁

更多精彩内容访问个人站点www.gaocaishun.cn

猜你喜欢

转载自blog.csdn.net/u014360817/article/details/54844752
今日推荐