Python中的multiprocessing和threading分别使用来实现多进程编程和多线程编程的。其中threading比较简单,而前者比较繁琐。

下面,我们进行一下分析:

多线程——threading

最简单的多线程编程的例子

上代码:

  1. import threading
  2. def threading_func(name):
  3. print "This is Function %s" % (name)
  4. if __name__ == '__main__':
  5. threadings = []
  6. for i in xrange(1, 5):
  7. temp_thread = threading.Thread(target=threading_func, args=(str(i),))
  8. threadings.append(temp_thread)
  9. temp_thread.start()
  10. for one_thread in threadings:
  11. one_thread.join()

这个程序执行的结果为:

  1. This is Function 1
  2. This is Function 2
  3. This is Function 3
  4. This is Function 4
  5. [Finished in 0.1s]

其中可以看到几个Thread类的使用方法,

  1. 使用list来记录所有的线程
  2. 声明一个线程时使用的方法为threading.Thread(target=xxx ,args=(xxx))其中这个target填写的是该线程中简要运行的方法名,args中要以元组的形式给出这个方法的参数。
  3. 使用start()方法来开始这个线程
  4. 使用join()方法来“合并线程”,合并的意思是:若在线程A中执行了C.join(),表示在C执行完毕后再去A中的join后开始执行。我们在主线程中一次调用所有线程的join(),表示所有线程均结束后,后面的语句才可以执行。与这个函数容易混淆的是setDaemon(True),Daemon是“后台”的意思,这个函数(True时)可以将一个线程设置为“后台线程”,主线程不考虑子线程的执行,一旦主线程执行完毕,则被终止,同时终止所有子线程的执行。当然,setDaemon(True)join()不同的是,前者需要在start()方法被调用前执行。另外,在join()方法中还可以设置Timeout,当join()方法没有设置Timeout时,主调线程会一直被阻塞到被调线程结束,若设置Timeout的话,则主调线程会被阻塞Timeout所设定的时间。

创建进程除了上面说的那种方法以外,还有另外一种方法,集成Thread类,具体写法如下:

  1. import threading
  2. class MyThread(threading.Thread):
  3. def __init__(self, ...):
  4. threading.Thread.__init__(self)
  5. self.xxx = ... # 设置其他属性
  6. def run(self):
  7. # code

将线程需要执行的代码全部放在run函数的code处即可。

进程通信

目前我只是搞了搞简单的进程通信,使用event类。

  1. import threading
  2. import time
  3. class MyThread(threading.Thread):
  4. def __init__(self, signal):
  5. threading.Thread.__init__(self)
  6. self.signal = signal
  7. def run(self):
  8. print "I am %s, I will sleep" % (self.name)
  9. self.signal.wait()
  10. print "I an %s, I awake" % (self.name)
  11. if __name__ == '__main__':
  12. signal = threading.Event()
  13. for t in xrange(0, 3):
  14. thread = MyThread(signal)
  15. thread.start()
  16. print "main thread sleep 3 seconds"
  17. time.sleep(3)
  18. signal.set()

这种写法就是上面所说的那种集成thread类的写法,signal是一个threading.Event()类型的变量,所有进程都执行到self.signal.wait()这里后等待signal被设置,当主进程执行到signal.set()时,会设置signal,表示发送了一个信号,唤醒全部阻塞在signal.wait()的进程,这叫做进程通信。更多内容等待以后学习。

进程互斥

有时候,我们希望两个进程不要同时更改一个资源,这时候我们就需要加上互斥锁mutex。代码如下:

  1. import threading
  2. import time
  3. counter = 0
  4. mutex = threading.Lock()
  5. class MyThread(threading.Thread):
  6. def __init__(self):
  7. # super(MyThread, self).__init__(self)
  8. threading.Thread.__init__(self)
  9. self.setName("Big Thread" + self.name)
  10. def run(self):
  11. global counter, mutex
  12. time.sleep(1)
  13. if mutex.acquire():
  14. counter += 1
  15. print "I am %s, set counter %d" % (self.name, counter)
  16. mutex.release()
  17. if __name__ == '__main__':
  18. for i in xrange(200):
  19. my_thread = MyThread()
  20. my_thread.start()

在每一个run函数中,都有以下方法:

mutex.acquire()获得锁,即加上锁。mutex.release释放锁,即解锁。当无法获得锁时,进程将会被阻塞,直到获得锁。上述代码执行结果为:

  1. I am Big ThreadThread-1, set counter 1
  2. I am Big ThreadThread-5, set counter 2
  3. I am Big ThreadThread-2, set counter 3
  4. I am Big ThreadThread-4, set counter 4
  5. I am Big ThreadThread-3, set counter 5
  6. [Finished in 1.0s]

可见counter这个变量是按照顺序加的,尽管进程号不是递增的。若我们将所有关于所的代码注释掉,得到以下代码:

  1. I am Big Thread Thread-1, set counter 1
  2. I am Big Thread Thread-2, set counter 2
  3. I am Big Thread Thread-3, set counter 3
  4. I am Big Thread Thread-6, set counter 4
  5. I am Big Thread Thread-8, set counter 5I am Big Thread Thread-5, set counter 6
  6. I am Big Thread Thread-10, set counter 7
  7. I am Big Thread Thread-9, set counter 9
  8. I am Big Thread Thread-7, set counter 8
  9. I am Big Thread Thread-4, set counter 10
  10. [Finished in 1.0s]

结构非常混乱。

Python中的multiprocessing和threading的更多相关文章

  1. python中多进程multiprocessing、多线程threading、线程池threadpool

    浅显点理解:进程就是一个程序,里面的线程就是用来干活的,,,进程大,线程小 一.多线程threading 简单的单线程和多线程运行:一个参数时,后面要加逗号 步骤:for循环,相当于多个线程——t=t ...

  2. python 中的multiprocessing 模块

    multiprocessing.Pipe([duplex]) 返回2个连接对象(conn1, conn2),代表管道的两端,默认是双向通信.如果duplex=False,conn1只能用来接收消息,c ...

  3. python中的锁lock=threading.Lock()

    避免多个线程保卫同一块数据的时候,产生错误,所以加锁来防止这种问题 个人理解:当打印结果是交替打印时,但是如果需求是需要打印完一个线程的内容后,再去打印另一个线程的内容,就需要用到锁 不加锁打印结果: ...

  4. 关于python中的多进程模块multiprocessing

    python中的multiprocessing是一个多进程管理包,主要作用也就是提供多进程,而不是多线程,在其中用的比较多估计也就是Process和Pipe两个类,如下代码所示: #!/usr/bin ...

  5. python中进程、线程、协程简述

    进程 python中使用multiprocessing模块对进程进行操作管理 进程同步(锁.信号量.事件) 锁 —— multiprocessing.Lock 只要用到了锁 锁之间的代码就会变成同步的 ...

  6. Python多进程库multiprocessing创建进程以及进程池Pool类的使用

    问题起因最近要将一个文本分割成好几个topic,每个topic设计一个regressor,各regressor是相互独立的,最后汇总所有topic的regressor得到总得预测结果.没错!类似bag ...

  7. python中的进程、线程(threading、multiprocessing、Queue、subprocess)

    Python中的进程与线程 学习知识,我们不但要知其然,还是知其所以然.你做到了你就比别人NB. 我们先了解一下什么是进程和线程. 进程与线程的历史 我们都知道计算机是由硬件和软件组成的.硬件中的CP ...

  8. python中multiprocessing模块

    multiprocess模块那来干嘛的? 答:利用multiprocessing可以在主进程中创建子进程.Threading是多线程,multiprocessing是多进程. #该模块和Threadi ...

  9. python中threading的用法

    摘自:http://blog.chinaunix.net/uid-27571599-id-3484048.html 以及:http://blog.chinaunix.net/uid-11131943- ...

随机推荐

  1. [Javascript] What is JavaScript Function Currying?

    Currying is a core concept of functional programming and a useful tool for any developer's toolbelt. ...

  2. git 取消追踪

    git rm --cached filePath这个操作不会删除这个文件

  3. web02--jsp数据传递

    1.创建一个login.jsp登陆界面 <%@ page language="java" import="java.util.*" pageEncodin ...

  4. python的按位运算

    #coding=utf-8#"&"按位与运算,是指一个数字转化为二进制,然后这些二进制的数按位来进行与运算a=7&18print a'''首先将7转化为二进制,得到 ...

  5. eclipse-android-activity_main/fragment_main文件处理

    android新建工程后,在res/layout/下有两个文件,之前用studio的时候貌似没有,只有一个文件,然后再测试Activity切换的时候,一直在纠结这个问题,下面是解决方法: 1)将fra ...

  6. svg转换工具

    package com.rubekid.springmvc.utils; import java.io.ByteArrayInputStream; import java.io.ByteArrayOu ...

  7. Android学习手记(1) Activity跳转

    新建Project,并将主页命名为MainActivity. 创建一个Activity 在App上“右键->New->Activity->Empty Activity”, 将新建的A ...

  8. MD5加密类

    public class MD5Util { public static String getMD5(String s) { char hexDigits[] = {'0', '1', '2', '3 ...

  9. WebStorm修改默认快捷键

    打开 "File" -> "Setting" -> "keymap",即可修改.

  10. ngrok内网穿透(微信调试:只试用于微信测试账号)

    一.简介 ngrok:https://ngrok.com 功能:就是把外网地址映射到本地的内网地址 缺点: 1.免费版生成的域名是随机的(由于我是用于调试,就没什么关系,如果是正式生产环境可能需要一个 ...