欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【脚本语言系列】关于Python多线程编程Threading, 你需要知道的事

程序员文章站 2022-07-14 16:50:42
...

如何使用Threading

Python中的Thread,Threading模块可用于多线程。Threading模块是Thread的封装。
一般而言,使用Threading模块即可。

# -*- coding: utf-8 -*-
#
import thread
def run(n):
    for i in range(n):
        print i
print thread.start_new_thread(run,(4,))
print thread.start_new_thread(run,(2,))
print thread.start_new_thread(run,(),{'n':4})

【脚本语言系列】关于Python多线程编程Threading, 你需要知道的事
【脚本语言系列】关于Python多线程编程Threading, 你需要知道的事

# -*- coding: utf-8 -*-
#
import threading
class mythread(threading.Thread):
    def __init__(self, num):
        threading.Thread.__init__(self)
        self.num = num
    def run(self):
        print 'I am ', self.num
t1 = mythread(1)
t2 = mythread(2)
t3 = mythread(3)
print t1.start()
print t2.start()
print t3.start()

【脚本语言系列】关于Python多线程编程Threading, 你需要知道的事
【脚本语言系列】关于Python多线程编程Threading, 你需要知道的事

# -*- coding: utf-8 -*-
#
import threading
def run(x, y):
    for i in range(x, y):
        print i
t1 = threading.Thread(target=run, args=(15, 20))
t1.start()
t2 = threading.Thread(target=run, args=(7, 11))
t2.start()

【脚本语言系列】关于Python多线程编程Threading, 你需要知道的事
【脚本语言系列】关于Python多线程编程Threading, 你需要知道的事

# -*- coding: utf-8 -*-
#
import threading
import time
class Mythread(threading.Thread):
    def __init__(self, id):
        threading.Thread.__init__(self)
        self.id = id
    def run(self):
        x = 0
        time.sleep(5)
        print self.id
def func():
    t.start()
    t.join()
    for i in range(5):
        print i
t = Mythread(2)
func()

【脚本语言系列】关于Python多线程编程Threading, 你需要知道的事
【脚本语言系列】关于Python多线程编程Threading, 你需要知道的事

# -*- coding: utf-8 -*-
#
import threading
import time
class Mythread(threading.Thread):
    def __init__(self, threadname):
        threading.Thread.__init__(self, name=threadname)
    def run(self):
        time.sleep(5)
        print self.getName()
def func1():
    t1.start()
    print "func1 done"
def func2():
    t2.start()
    print "func2 done"
t1 = Mythread("t1")
t2 = Mythread("t2")
t2.setDaemon(True)
func1()
func2()

【脚本语言系列】关于Python多线程编程Threading, 你需要知道的事
【脚本语言系列】关于Python多线程编程Threading, 你需要知道的事

线程同步

为了保证多个线程共同对某个数据进行修改造成的不可预料的后果,需要对多个线程进行同步。使用Thread对象的Lock和RLock可以实现简单的线程同步。

# -*- coding: utf-8 -*-
#
import threading
import time
class mythread(threading.Thread):
    def __init__(self, threadname):
        threading.Thread.__init__(self, name = threadname)
    def run(self):
        global x
        lock.acquire()
        for i in range(3):
            x = x+1
        time.sleep(2)
        print x
        lock.release()
lock = threading.RLock()
t1 = []
for i in range(10):
    t = mythread(str(i))
    t1.append(t)
x=0
for i in t1:
    i.start()

【脚本语言系列】关于Python多线程编程Threading, 你需要知道的事
【脚本语言系列】关于Python多线程编程Threading, 你需要知道的事

# -*- coding: utf-8 -*-
#
import threading
class Producer(threading.Thread):
    def __init__(self, threadname):
        threading.Thread.__init__(self, name=threadname)
    def run(self):
        global x
        con.acquire()
        if x == 1000000:
            con.wait()
            pass
        else:
            for i in range(1000000):
                x = x + 1
            con.notify()
        print x
        con.release()
class Consumer(threading.Thread):
    def __init__(self, threadname):
        threading.Thread.__init__(self, name=threadname)
    def run(self):
        global x
        con.acquire()
        if x == 0:
            con.wait()
            pass
        else:
            for i in range(1000000):
                x = x - 1
            con.notify()
        print x
        con.release()        
con = threading.Condition()
x=0
p = Producer('Producer')
c = Consumer('Consumer')
p.start()
c.start()
p.join()
c.join()
print x

【脚本语言系列】关于Python多线程编程Threading, 你需要知道的事

线程间通讯

Python提供了Event对象用于线程间的相互通讯。Event对象是由线程设置的信号标志,如果信号标志为真,则其他线程等待直到信号解除。Event对象包含了设置信号、清楚信号、等待等用于实现线程间的通讯。

# -*- coding: utf-8 -*-
#
import threading
class mythread(threading.Thread):
    def __init__(self, threadname):
        threading.Thread.__init__(self, name = threadname)
    def run(self):
        global event
        if event.isSet():
            event.clear()
            event.wait()
            print self.getName()
        else:
            print self.getName()
            event.set()
event = threading.Event()
event.set()
t1 = []
for i in range(10):
    t = mythread(str(i))
    t1.append(t)
for i in t1:
    i.start()

【脚本语言系列】关于Python多线程编程Threading, 你需要知道的事
【脚本语言系列】关于Python多线程编程Threading, 你需要知道的事

什么是Threading

进程是操作系统中应用程序的执行实例,而线程是进程内部的一个执行单元。
当系统创建一个进程后,也就创建了一个主线程。
每个进程至少有一个线程,也可以有多个线程。
在程序中使用多线程可以实现并行处理,充分利用CPU。
Python提供了对多线程的支持。在Python中可以方便地使用多线程编程。