# 多进程
# Windows下面没有fork ,请在linux下跑下面的代码 import os print('Process (%s) start...' % os.getpid()) 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))

# windows 下没有 fork,实现多进程要使用 multiprocessing 模块

from multiprocessing import Process
import os, time def run_proc(name):
print('Run child process %s (%s)...' % (name, os.getpid())) if __name__=='__main__':
print('Parent process %s.' % os.getpid())
p = Process(target=run_proc, args=('test',)) # target 将函数作为单个进程,args 是传参数
print('Child process will start.')
p.start() # 启动
p.join() # 等待子进程结束后继续运行
print('Child process is end.')
print('..................')
time.sleep(1) # 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) # random() 方法返回随机生成的一个实数,它在[0,1)范围内。
end = time.time()
print('Task %s runs %0.2f seconds' % (name, (end-start))) if __name__ == '__main__':
print('Parent process %s.'% os.getpid())
p = Pool(3)
for i in range(4):
p.apply_async(long_time_task, args=(i,))
print('waiting for all subprocesses done...')
p.close()
p.join()
print('Done')
print('..................')
time.sleep(1) # 对Pool对象调用join()方法会等待所有子进程执行完毕,调用join()之前必须先调用close(),调用close()之后就不能继续添加新的Process了。 # 进程间通信 # Python的multiprocessing模块包装了底层的机制,提供了Queue、Pipes等多种方式来交换数据。 # 参考链接:https://www.cnblogs.com/kaituorensheng/p/4445418.html#_label5 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('Gets %s from queue.' % value) if __name__ == '__main__':
# 父进程创建队列,传递给各个子进程
q = Queue()
pw = Process(target=write, args=(q,))
pr = Process(target=read, args=(q,)) pw.start()
pr.start()
pw.join()
pr.terminate() # pr进程里是死循环,无法等待其结束,只能强行终止:
print('Done')
print('..................')
time.sleep(1) ############################################################## # 多线程 '''
多任务可以由多进程完成,也可以由一个进程内的多线程完成。 我们前面提到了进程是由若干线程组成的,一个进程至少有一个线程。 由于线程是操作系统直接支持的执行单元,因此,高级语言通常都内置多线程的支持,Python也不例外,并且,Python的线程是真正的Posix Thread,而不是模拟出来的线程。
''' # Python的标准库中,绝大多数情况下,我们只需要使用threading这个高级模块。 # 启动一个线程就是把一个函数传入并创建Thread实例,然后调用start()开始执行: import time, threading # 新进程执行的代码: def loop():
print('thread %s is running ...' % threading.current_thread().name)
n = 0
while n < 3:
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 running ...' % threading.current_thread().name)
t = threading.Thread(target=loop, name='LoopTread') # 子线程的名字在创建时指定,我们用LoopThread命名子线程。名字仅仅在打印时用来显示,完全没有其他意义
t.start()
t.join()
print('thread %s ended.' % threading.current_thread().name) # 任何进程默认就会启动一个线程,我们把该线程称为主线程,主线程又可以启动新的线程
# current_thread()函数,它永远返回当前线程的实例。 # Lock # 多线程和多进程最大的不同在于,多进程中,同一个变量,各自有一份拷贝存在于每个进程中,互不影响,
# 而多线程中,所有变量都由所有线程共享,所以,任何一个变量都可以被任何一个线程修改,因此,线程之间共享数据最大的危险在于多个线程同时改一个变量,把内容给改乱了。 # 假定这是你的银行存款:
balance = 0 def change_it(n):
# 先存后取,结果应该为0:
global balance # 告诉Python这个变量名不是局部的,而是 全局 的
###
balance = balance + n
balance = balance - n
### 这两句语句在一个线程里应该是要连续执行才对 def run_thread(n):
for i in range(5000000):
change_it(n) t1 = threading.Thread(target=run_thread,args=(5,))
t2 = threading.Thread(target=run_thread,args=(8,))
t1.start()
t2.start()
t1.join()
t2.join()
print(balance) # 由于线程的调度是由操作系统决定的,当t1、t2交替执行时,只要循环次数足够多,balance的结果就不一定是0了。
print('Done.......................') # 为函数 change_it 添加一个锁
# 当某个线程开始执行change_it()时,该线程因为获得了锁,因此其他线程不能同时执行change_it(),只能等待,直到锁被释放后,获得该锁以后才能执行。 balance = 0
lock = threading.Lock() def run_thread(n):
for i in range(5000000):
# p(信号量)
lock.acquire()
try:
change_it(n)
finally:
# v(信号量)
lock.release() print(balance)
print('Done.......................')

python learning Process and Thread.py的更多相关文章

  1. python multi process multi thread

    muti thread: python threading: https://docs.python.org/2/library/threading.html#thread-objects https ...

  2. python learning Exception & Debug.py

    ''' 在程序运行的过程中,如果发生了错误,可以事先约定返回一个错误代码,这样,就可以知道是否有错,以及出错的原因.在操作系统提供的调用中,返回错误码非常常见.比如打开文件的函数open(),成功时返 ...

  3. Linux process vs thread

    Linux process vs thread Question I have a query related to the implementation of threads in Linux. L ...

  4. Linux Process VS Thread VS LWP

    Process program program==code+data; 一个进程可以对应多个程序,一个程序也可以变成多个进程.程序可以作为一种软件资源长期保存,以文件的形式存放在硬盘 process: ...

  5. process vs thread

    process vs thread http://blog.csdn.net/mishifangxiangdefeng/article/details/7588727 6.进程与线程的区别:系统调度是 ...

  6. 用命令访问D:\python学习\wendjia教程\aa.py

    用命令访问D:\python学习\wendjia教程\aa.py d:                                -----------切换到D盘 cd python学习\wend ...

  7. python解无忧公主数学题107.py

    python解无忧公主数学题107.py """ python解无忧公主数学题107.py http://mp.weixin.qq.com/s?__biz=MzI5ODE ...

  8. Activity, Service,Task, Process and Thread之间的关系

    Activity, Service,Task, Process and Thread之间到底是什么关系呢? 首先我们来看下Task的定义,Google是这样定义Task的:a task is what ...

  9. kafka.common.KafkaException: Failed to acquire lock on file .lock in /tmp/kafka-logs. A Kafka instance in another process or thread is using this directory.

    1.刚才未启动zookeeper集群的时候,直接启动kafka脚本程序,kafka报错了,但是进程号启动起来来,再次启动出现如下所示的问题,这里先将进程号杀死,再启动脚本程序. [hadoop@sla ...

随机推荐

  1. 深入理解PHP 数组之count 函数

    count()PHP count() 函数用于计算数组中的单元数目或对象中的属性个数,返回数组的单元个数或对象中的属性个数.语法:int count( mixed var [, int mode] ) ...

  2. 2017-2018-2 20155315《网络对抗技术》Exp3:免杀原理与实践

    实验目的 通过本部分内容的学习,认识到杀软局限性,提高在工作生活中对于恶意软件防范能力. 教程 实验内容 使用msf编码器,msfvenom,veil-evasion,shellcode编程等免杀工具 ...

  3. Catalan&Stirling数

    Catalan&Stirling数 Tags:数学 作业部落 评论地址 Catalan数 \(1,1,2,5,14,42,132,429,1430,4862,16796,58786...\) ...

  4. mfc 类的const对象

    知识点 类的const对象 const类的成员函数 一. 类的const对象 const 意谓着只读 意谓着所标记的类成员变量不成出现在=号的左边. 构造函数除外. ,,); //比如在存放出生日期的 ...

  5. Linux下开发python django程序(django数据库多对多关系)

    1.多对多关系数据访问 models.py设置 from django.db import models # Create your models here. sex_choices=( ('f',' ...

  6. HDU - 5877 Weak Pair (dfs+树状数组)

    题目链接:Weak Pair 题意: 给出一颗有根树,如果有一对u,v,如果满足u是v的父节点且vec[u]×vec[v]<=k,则称这对结点是虚弱的,问这棵树中有几对虚弱的结点. 题解: 刚开 ...

  7. P3877 [TJOI2010]打扫房间

    xswl以为是个插头dp,然后发现就是个sb题 相当于就是个匹配.每个格子度数为2,所以可以匹配2个相邻的点.匹配显然的用网络流.最后check有没有不匹配的点即可. #include<bits ...

  8. 解决 java循环中使用 Map时 在put值时value值被覆盖的问题

    其实很简单,只需要把容器换成list 然后在循环中,每次循环末尾map = new HashMap() 或者直接在循环中一开始就实例化hashmap(Map map = new HashMap();) ...

  9. tcp三次握手四次挥手那些事

    建立TCP需要三次握手才能建立,而断开连接则需要四次挥手.三次握手,四次挥手流程图如下: 一.首先看下如何通过三次挥手----------建立连接 首先客户端发送连接请求报文,服务端接受连接后回复AC ...

  10. APP性能测试中的几个重要概念

    转载一篇文章,关于app性能测试的几个概念,对于想要接触app测试的朋友或许有些帮助. 我们在使用各种 App 的时候基本会关注到:这款软件挺耗流量的?运行起来设备掉电有点快嘛?切换页面的时候还会有卡 ...