def main():
    print('Process (%s) start...' % os.getpid())
    # Only works on Unix/Linux/Mac:
    pid = os.fork()
    if pid == 0:
        print('I am child process (%s) and my parent is %s.' % (os.getpid(), os.getppid()))
    else:
        print('I (%s) just created a child process (%s).' % (os.getpid(), pid))

    print('Parent process %s.' % os.getpid())
    p = Process(target=run_proc, args=('test',))
    print('Child process will start.')
    p.start()
    p.join()
    print('Child process end.')

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

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

    print('$ nslookup')
    p = subprocess.Popen(['nslookup'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    output, err = p.communicate(b'set q=mx\npython.org\nexit\n')
    print(output.decode('utf-8'))
    print('Exit code:', p.returncode)
Exemple #2
0
def tryforkwindows(n):
    if n == 1:
        print('Parent process %s.' % os.getpid())
        sec = 3
        p = Process(target=run_proc, args=('test', sec))
        print('Child process will start ...')
        p.start()
        childlast = 15
        while childlast >= 0:
            print('# Parent (%s) and its child (%s).' % (os.getpid(), p.pid))
            time.sleep(1)
            childlast -= 1

        # Not successful!
        # os.kill(p.pid, signal.CTRL_C_EVENT)
        # p.join()

        print('Parent (%s) kills child (%s)' % (os.getpid(), p.pid))
        p.terminate()
        print('Child process end.')

    if n == 2:
        print('Parent process %s.' % os.getpid())
        process_num = 16
        p = Pool(process_num)
        for i in range(process_num):
            p.apply_async(long_time_task, args=(i,))

        print('Waiting for all subprocesses done...')
        p.close()
        p.join()
        print('All subprocesses done.')

    if n == 3:
        cmd = 'ping www.baidu.com'
        print(cmd)
        r = subprocess.call(cmd.split())
        print('Exit code = ', r)

    if n == 4:
        q = Queue()
        pw = Process(target=q_write, args=(q,))
        pr = Process(target=q_read, args=(q,))
        pr.start()
        pw.start()
        pw.join()
        pr.terminate()

    return
"""如果要启动大量的子进程,可以用进程池的方式批量创建子进程"""
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('Waiting for all subprocesses done...')
    p.close()
    p.join()
    print('All subprocesses done.')
"""对Pool对象调用join()方法会等待所有子进程执行完毕,调用join()之前必须先调用close(),调用close()之后就不能继续添加新的Process了。
请注意输出的结果,task 0,1,2,3是立刻执行的,而task 4要等待前面某个task完成后才执行,这是因为Pool的默认大小在我的电脑上是4,因此,最多同时执行4个进程。这是Pool有意设计的限制,并不是操作系统的限制。如果改成:
p = Pool(5)
就可以同时跑5个进程。
由于Pool的默认大小是CPU的核数,如果你不幸拥有8核CPU,你要提交至少9个子进程才能看到上面的等待效果。"""

#子进程
"""很多时候,子进程并不是自身,而是一个外部进程。我们创建了子进程后,还需要控制子进程的输入和输出。
subprocess模块可以让我们启动一个子进程,然后控制其输入和输出
下面的例子演示了如何在Python代码中运行命令nslookup www.python.org,这和命令行直接运行的效果是一样的:"""
import subprocess
Exemple #4
0
    p.join()
    print('Child process is end')


print('\n')


def longTimeTask(name):
    print('Run task {0} pid is {1}'.format(name, os.getpid()))
    start = time.time()
    time.sleep(random.random() * 3)
    end = time.time()
    print('Task {0} runs {1:.2f} seconds'.format(name, end - start))
# Pool
if __name__ == '__main__':
    print('Parent process is {0}'.format(os.getppid()))
    p = Pool(4)
    for i in range(5):
        p.apply_async(longTimeTask, args=(i,))
    print('Waiting all subprocess down')
    p.close()
    p.join()
    print('All process down')

print('\n')
# subprocess
if __name__ == '__main__':
    print('$ nslookup www.python.org')
    r = subprocess.call(['nslookup', 'www.python.org'])
    print('Exit code:', r)
    #time.sleep(random.random() * 3)
    for i in range(50):
        time.sleep(0.01)
        counter.increment()
    end = time.time()
    print 'Task %s runs %0.2f seconds.' % (name, (end - start))


if __name__ == '__main__':
    manager = Manager()
    # 创建共享Counter类实例对象的变量,Counter类的初始值0
    counter = manager.Counter(0)
    print 'Parent process %s.' % os.getpid()
    p = Pool()
    for i in range(5):
        p.apply_async(long_time_task, args=(str(i), counter))
    print 'Waiting for all subprocesses done...'
    p.close()
    p.join()
    print 'All subprocesses done.'
    print counter.value()

# 共享实例模板
from multiprocessing import Pool, Value, Lock, Manager
import os, time, random


def long_time_task(name, requestCount, countList):
    requestCount.value = requestCount.value + 1
    print u"计数:", requestCount.value
    countList.append(requestCount.value)
    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)  # 代表最多同时执行几个进程,同时是瞬时,看的是cpu的核心数,所以cpu不够太高应该也没有
        # task 0,1,2,3是立刻执行的,而task 4要等待前面某个task完成后才执行,这是因为Pool的大小是4,因此,最多同时执行4个进程。
        # Pool的默认大小是CPU的核数,
        for i in range(5):
            p.apply_async(long_time_task, args=(i, ))  #创建并启动所有子进程
        print('Waiting for all subprocesses done...')
        p.close()
        p.join(
        )  # 对Pool对象调用join()方法会等待所有子进程执行完毕,调用join()之前必须先调用close(),调用close()之后就不能继续添加新的Process了
        print('All subprocesses done.')
    # 运行结果
    # Parent process 888.
    # Child process will start.
    # Run child process test (25688)...
    # Child process end.
    # Parent process 888.
    # Waiting for all subprocesses done...
    # Run task 0 (50828)...
    # Run task 1 (26584)...
    # Run task 2 (28356)...
Exemple #7
0
	print("child process end.")

#线程池
import time,random
from multiprocessing import Pool
def long_time_task(name):
	print("child process %s(%s,%s) run"%(name,os.getpid(),os.getppid()))
	start=time.time()
	time.sleep(random.random()*3)
	end=time.time()
	print("Tast %s runs %0.2f seconds."%(name,end-start))
if __name__=="__main__":
	print("Parent process %s"%os.getpid())
	p=Pool(5)
	for i in range(10):
		p.apply_async(long_time_task,args=(i,)) #子进程是本身
	print("Waiting for all Processing done...")
	p.close()
	p.join()
	print('All subprocesses done.')

#子进程不是本身
import subprocess

print("nslookup rrs.focushow.cn")
r=subprocess.call("nslookup rrs.focushow.cn")
print("Exit code:%d"%r)


#进程间的通信
#Process之间肯定是需要通信的,操作系统提供了很多机制来实现进程间的通信。
p.join()  # 等待子进程结束后再继续往下运行
print("Child process end.")

print("#" * 80)
"""
    Pool 进程池,用于批量创建子进程
"""
from multiprocessing import Pool

import 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 senconds.." % (name, (end - start)))


p = Pool(4)
for i in range(5):
    p.apply_async(long_time_task, args=(i, ))  # 非阻塞方式。任务的执行不会阻塞任务的添加到进程池中
    # p.apply(long_time_task, args=(i,))    # 阻塞方式,等到上一个任务即这里的long_time_task执行完了才能继续添加

print("waiting for all subProcess finish...")
p.close()  # 关闭进程池,光比后P不在接受新的任务或请求
p.join()  # 等待P中的所有子进程执行完成,必须放在close语句之后。
print("All subProcess finished")
print("#" * 80)
Exemple #9
0
    # 等待进程执行完后再往下执行,用于同步
    p.join()
    print("--- child process end ---")

#print3
print("===========创建子进程:Pool,进程池中批量创建子进程==========")


def batchProc(name):
    print("run sub-process name:%s , id:%s..." % (name, os.getpid()))
    start = time.time()
    time.sleep(random.random() * 3)
    end = time.time()
    print("sub-process (%s : %s) running last %s ..." % (name, os.getpid(),
                                                         (end - start)))


if __name__ == '__main__':
    print("Pool,parent progress (%s)" % os.getpid())
    # Pool默认大小(同时执行的进程数)是CPU核数。
    p = Pool(6)
    for i in range(6):
        # 每个子进程执行的时候,都会把print3打印一遍
        p.apply_async(batchProc, args=(i, ))
    print("waiting for all sub-process done ...")
    # 调用close之前必须先调用close,close之后就不能添加新的process了。
    p.close()
    # 等待所有子进程执行完毕
    p.join()
    print("---- END ----")
if __name__ == '__main__':
    print('Parent process %s.' % os.getpid())
    p = Process(target=run_proc, args=('test', ))
    print('Child process will start.')
    p.start()
    p.join()
    print('Child process end.')
#要启动大量的子进程,用进程池的方式创建子进程
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, ))  #apply_async是异步非阻塞的,不用等待当前进程执行完毕
    print('Waiting for all subprocesses done')
    p.close()
    p.join()
    print("All subprocesses done.")
    print('Parent process %s.' % os.getpid())
    p = Process(target=run_proc, args=('test', ))  # 创建一个进程实例
    print('Child process will start.')
    p.start()  # 用start()方法启动
    p.join()  # join()方法等待子进程结束后再继续往下运行,通常用于进程间的同步
    print('Child process end.')

# 2.1 进程池 Pool
print('ABC')


def long_time_task(name):
    print('Run task %s (%s)...' % (name, os.getpid()))
    start = time.time()
    time.sleep(random.random() * 3)  # time.sleep 方法为推迟执行一定秒数
    end = time.time()
    print('Task %s runs %0.2f seconds.' % (name, (end - start)))


if __name__ == '__main__':
    print('Parent process %s.' % os.getpid())
    p = Pool(9)  # 限制同时运行的进程数最多为9个,默认大小是CPU核数
    for i in range(8):
        p.apply_async(
            long_time_task,
            args=(i, ))  # apply_async 是异步非阻塞,不用等待当前进程执行完毕,随时根据系统调度来进行进程切换。
    print('Waiting for all subprocesses done...')
    p.close()  # close 方法后不能继续添加新的子进程了
    p.join()
    print('All subprocesses done.')
Exemple #12
0
import os, time, random

def pool_task(taskID):
	start = time.time()
	print("=== pool_task 线程:%s === 开始时间:%d"%(os.getpid(), start))

	time.sleep(random.random() * 3)
	print("执行任务:",taskID)

	end = time.time()
	print("=== pool_task 线程:%s === 结束时间:%d"%(os.getpid(), end))
	print("执行时间:",(end - start))

p = Pool(4)
for i in range(5):
	p.apply_async(pool_task, args=(i,))


print("准备执行子线程程序!")
p.close()
p.join()
print("所有子线程已经执行完毕")
# 准备执行子线程程序!
# === pool_task 线程:38658 === 开始时间:1494832956
# === pool_task 线程:38659 === 开始时间:1494832956
# === pool_task 线程:38660 === 开始时间:1494832956
# === pool_task 线程:38661 === 开始时间:1494832956
# 执行任务: 1
# === pool_task 线程:38659 === 结束时间:1494832957
# 执行时间: 1.2386257648468018
# === pool_task 线程:38659 === 开始时间:1494832957
Exemple #13
0
from multiprocessing import Pool


def long_time_task(name):
    print("child process %s(%s,%s) run" % (name, os.getpid(), os.getppid()))
    start = time.time()
    time.sleep(random.random() * 3)
    end = time.time()
    print("Tast %s runs %0.2f seconds." % (name, end - start))


if __name__ == "__main__":
    print("Parent process %s" % os.getpid())
    p = Pool(5)
    for i in range(10):
        p.apply_async(long_time_task, args=(i, ))  #子进程是本身
    print("Waiting for all Processing done...")
    p.close()
    p.join()
    print('All subprocesses done.')

#子进程不是本身
import subprocess

print("nslookup rrs.focushow.cn")
r = subprocess.call("nslookup rrs.focushow.cn")
print("Exit code:%d" % r)

#进程间的通信
#Process之间肯定是需要通信的,操作系统提供了很多机制来实现进程间的通信。
#Python的multiprocessing模块包装了底层的机制,
#  multiprocessing.Pool 进程池
#############################
from multiprocessing import Pool


def run_proc_1(*args, **kw):
    start = time.time()
    time.sleep(random.random() * 2)
    print('  [%s] job done, time used %s' % (os.getpid(), time.time() - start))


print('====== multiprocessing.Pool ======')
p = Pool(3)
start = time.time()
for i in range(5):
    p.apply_async(run_proc_1)
p.close()  # 调用join()之前必须先调用close(),调用close()之后就不能继续添加新的Process了。
p.join()
print('time used: %s' % (time.time() - start))

#############################
#  subporcess: 用于调用外部程序
#############################
import subprocess

print('====== subprocess ======')
# 查询 baidu ip
print('$ nslookup www.baidu.com')
r = subprocess.call(['nslookup', 'www.baidu.com'])
print('Exit code:', r)