当前位置: 首页 > 编程笔记 >

python threading模块操作多线程介绍

王季萌
2023-03-14
本文向大家介绍python threading模块操作多线程介绍,包括了python threading模块操作多线程介绍的使用技巧和注意事项,需要的朋友参考一下

python是支持多线程的,并且是native的线程。主要是通过thread和threading这两个模块来实现的。thread是比较底层的模块,threading是对thread做了一些包装的,可以更加方便的被使用。这里需要提一下的是python对线程的支持还不够完善,不能利用多CPU,但是下个版本的python中已经考虑改进这点,让我们拭目以待吧。

    threading模块里面主要是对一些线程的操作对象化了,创建了叫Thread的class。一般来说,使用线程有两种模式,一种是创建线程要执行的函数,把这个函数传递进Thread对象里,让它来执行;另一种是直接从Thread继承,创建一个新的class,把线程执行的代码放到这个新的class里。我们来看看这两种做法吧。

#-*- encoding: gb2312 -*-
import string, threading, time

def thread_main(a):
  global count, mutex
  # 获得线程名
  threadname = threading.currentThread().getName()
  
  for x in xrange(0, int(a)):
    # 取得锁
    mutex.acquire()
    count = count + 1
    # 释放锁
    mutex.release()
    print threadname, x, count
    time.sleep(1)
  
def main(num):
  global count, mutex
  threads = []
  
  count = 1
  # 创建一个锁
  mutex = threading.Lock()
  # 先创建线程对象
  for x in xrange(0, num):
    threads.append(threading.Thread(target=thread_main, args=(10,)))
  # 启动所有线程
  for t in threads:
    t.start()
  # 主线程中等待所有子线程退出
  for t in threads:
    t.join() 
  
  
if __name__ == '__main__':
  num = 4
  # 创建4个线程
  main(4)

上面的就是第一种做法,这种做法是很常见的,下面是另一种,曾经使用过Java的朋友应该很熟悉这种模式:

#-*- encoding: gb2312 -*-
import threading
import time

class Test(threading.Thread):
  def __init__(self, num):
    threading.Thread.__init__(self)
    self._run_num = num
  
  def run(self):
    global count, mutex
    threadname = threading.currentThread().getName()
  
    for x in xrange(0, int(self._run_num)):
      mutex.acquire()
      count = count + 1
      mutex.release()
      print threadname, x, count
      time.sleep(1)

if __name__ == '__main__':
  global count, mutex
  threads = []
  num = 4
  count = 1
  # 创建锁
  mutex = threading.Lock()
  # 创建线程对象
  for x in xrange(0, num):
    threads.append(Test(10))
  # 启动线程
  for t in threads:
    t.start()
  # 等待子线程结束
  for t in threads:
    t.join() 
 类似资料:
  • 问题内容: 最近,我正在阅读一个教程,其中遇到了一条声明: “Java语言规范保证了读取或写入的变量是一个原子操作(除非该变量的类型的或)类型的操作变量或者是只有当它们与申报原子的关键字。” 或提供类似的方法,并且其是原子的。 我对以上声明感到有些困惑。.请您澄清一下 何时使用 或 使用类。 问题答案: 否则(与作为一个)是一个原子操作。但是执行操作不是原子操作,因为它需要读取a的值,递增和写入a

  • 本文向大家介绍nodejs URL模块操作URL相关方法介绍,包括了nodejs URL模块操作URL相关方法介绍的使用技巧和注意事项,需要的朋友参考一下 url模块 处理HTTP请求时url模块使用率超高,因为该模块允许解析URL、生成URL,以及拼接URL。首先我们来看看一个完整的URL的各组成部分。 我们可以使用.parse方法来将一个URL字符串转换为URL对象,示例如下。 传给.pars

  • 本文向大家介绍Python bsddb模块操作Berkeley DB数据库介绍,包括了Python bsddb模块操作Berkeley DB数据库介绍的使用技巧和注意事项,需要的朋友参考一下 bsddb模块是用来操作bdb的模块,bdb是著名的Berkeley DB,它的性能非常好,mysql的存储后端引擎都支持bdb的方式。这里简单介绍一些关于bsddb的使用方法。 bdb不同于一般的关系数据库

  • 本文向大家介绍python程序中的线程操作 concurrent模块使用详解,包括了python程序中的线程操作 concurrent模块使用详解的使用技巧和注意事项,需要的朋友参考一下 一、concurrent模块的介绍 concurrent.futures模块提供了高度封装的异步调用接口 ThreadPoolExecutor:线程池,提供异步调用 ProcessPoolExecutor:进程池

  • 本文向大家介绍iOS多线程介绍,包括了iOS多线程介绍的使用技巧和注意事项,需要的朋友参考一下 一、前言部分 最近在面试,重新温习了一遍多线程,希望加深一遍对于多线程的理解。 1、什么是进程? 1).要了解线程我们必须先了解进程,通俗来讲进程就是在系统中运行的一个应用程序。 2).每个线程之间是独立存在的,分别运行在其专用的且受保护的内存空间中。 3).比如打开QQ或Xcode系统会分别开启两个进

  • Important 要用内核模块操作,必须有一个在运行的 Ceph 集群。 获取映像列表 要挂载块设备映像,先罗列出所有的映像。 rbd list 映射块设备 用 rbd 把映像名映射为内核模块。必须指定映像名、存储池名、和用户名。若 RBD 内核模块尚未加载, rbd 命令会自动加载。 sudo rbd map {pool-name}/{image-name} --id {user-name}