Home Backend Development Python Tutorial Python multithreading

Python multithreading

Nov 23, 2016 pm 01:59 PM
python

Multi-threading is similar to executing multiple different programs at the same time. Multi-threading has the following advantages:

Using threads can put tasks in long-term programs into the background for processing.

The user interface can be more attractive, so that if the user clicks a button to trigger the processing of certain events, a progress bar can pop up to show the progress of the processing

The running speed of the program may be accelerated

In some waiting tasks, For example, threads are more useful for user input, file reading and writing, and network sending and receiving data. In this case we can release some precious resources such as memory usage and so on.

Threads are still different from processes during execution. Each independent thread has an entry point for program execution, a sequential execution sequence, and an exit point for the program. However, threads cannot execute independently and must exist in the application program, and the application program provides multiple thread execution control.

Each thread has his own set of CPU registers, called the thread's context, which reflects the state of the CPU registers the last time the thread ran.

The instruction pointer and stack pointer register are the two most important registers in the thread context. The thread always runs in the process context. These addresses are used to mark the memory in the address space of the process that owns the thread.

Threads can be preempted (interrupted).

Threads can be put on hold (also called sleeping) while other threads are running - this is called thread backing off.

Start learning Python threads

There are two ways to use threads in Python: functions or classes to wrap thread objects.

Functional: Call the start_new_thread() function in the thread module to generate a new thread. The syntax is as follows:

thread.start_new_thread (function, args[, kwargs])

Parameter description:

function - thread function.

args - the parameters passed to the thread function, it must be a tuple type.

kwargs - optional parameters.

Example:

#!/usr/bin/python

import thread

import time

#Define a function for thread

def print_time(threadName, delay):

count = 0

while count < 5:

time.sleep(delay)

count += 1

print "%s: %s" % ( threadName, time.ctime(time.time()) )

# Create two threads

try:

thread.start_new_thread(print_time, ("Thread-1", 2,))

thread.start_new_thread(print_time, ("Thread-2", 4,) )

except:

print "Error: unable to start thread"

while 1:

pass

Execute the above program and the output result is as follows:

Thread-1: Thu Jan 22 15:42:17 2009

Thread-1: Thu Jan 22 15:42:19 2009

Thread-2: Thu Jan 22 15:42:19 2009

Thread-1: Thu Jan 22 15:42 :21 2009

Thread-2: Thu Jan 22 15:42:23 2009

Thread-1: Thu Jan 22 15:42:23 2009

Thread-1: Thu Jan 22 15:42:25 2009

Thread-2: Thu Jan 22 15:42:27 2009

Thread-2: Thu Jan 22 15:42:31 2009

Thread-2: Thu Jan 22 15:42:35 2009

Thread The end generally relies on the natural end of the thread function; you can also call thread.exit() in the thread function, which throws SystemExit exception to achieve the purpose of exiting the thread.

Threading module

Python provides support for threads through two standard libraries: thread and threading. thread provides low-level, primitive threads and a simple lock.

Other methods provided by the thread module:

threading.currentThread(): Returns the current thread variable.

threading.enumerate(): Returns a list containing running threads. Running refers to after the thread starts and before it ends, excluding threads before starting and after termination.

threading.activeCount(): Returns the number of running threads, which has the same result as len(threading.enumerate()).

In addition to usage methods, the thread module also provides the Thread class to handle threads. The Thread class provides the following methods:

run(): Method used to represent thread activity.

start(): Start thread activity.

join([time]): Wait until the thread terminates. This blocks the calling thread until the thread's join() method is called abort - exit normally or throw an unhandled exception - or an optional timeout occurs.

isAlive(): Returns whether the thread is active.

getName(): Returns the thread name.

setName(): Set the thread name.

Use the Threading module to create a thread

Use the Threading module to create a thread, inherit directly from threading.Thread, and then override the __init__ method and run method:

#!/usr/bin/python

import threading

import time

exitFlag = 0

class myThread (threading.Thread): #Inherit the parent class threading.Thread

def __init__(self, threadID, name, counter):

                                                        .Thread.__init__(self)

                                                                                                                                                                      . #Write the code to be executed into the run function. The thread is being created. After that, run the run function

PRINT "Starting"+Self.name

Print_time (Self.name, Self.Counter, 5)

Print "Exning"+Self.name

Def Print_time (ThreadName, Delay, Delay , counter):

while counter:

if exitFlag:

thread.exit()

time.sleep(delay)

print "%s: %s " % (threadName, time.ctime(time.time ()))

counter -= 1

# Create a new thread

thread1 = myThread(1, "Thread-1", 1)

thread2 = myThread(2, "Thread-2", 2)

# Start the thread

thread1.start()

thread2.start()

print "Exiting Main Thread"

The above program execution results are as follows;

Starting Thread-1

Starting Thread-2

Exiting Main Thread

Thread-1: Thu Mar 21 09:10:03 2013

Thread-1: Thu Mar 21 09:10:04 2013

Thread-2: Thu Mar 21 09:10:04 2013

Thread-1: Thu Mar 21 09:10:05 2013

Thread-1: Thu Mar 21 09:10:06 2013

Thread-2: Thu Mar 21 09: 10:06 2013

Thread-1: Thu Mar 21 09:10:07 2013

Exiting Thread-1

Thread-2: Thu Mar 21 09:10:08 2013

Thread-2: Thu Mar 21 09 :10:10 2013

Thread-2: Thu Mar 21 09:10:12 2013

Exiting Thread-2

Thread synchronization

If multiple threads jointly modify a certain data, it may occur Unpredictable results. In order to ensure the correctness of the data, multiple threads need to be synchronized.

Simple thread synchronization can be achieved by using Lock and Rlock of Thread object. Both objects have acquire method and release method. For those data that need to be operated by only one thread at a time, the operation can be placed in acquire and release. between methods. As follows:

The advantage of multi-threading is that it can run multiple tasks at the same time (at least that's how it feels). But when threads need to share data, there may be data out-of-synchronization problems.

Consider this situation: all elements in a list are 0, the thread "set" changes all elements to 1 from back to front, and the thread "print" is responsible for reading the list from front to back and printing.

Then, maybe when the thread "set" starts to change, the thread "print" will print the list, and the output will be half 0 and half 1. This is the desynchronization of the data. To avoid this situation, the concept of locks was introduced.

The lock has two states - locked and unlocked. Whenever a thread such as "set" wants to access shared data, it must first obtain the lock; if another thread such as "print" has obtained the lock, then let the thread "set" pause, which is synchronous blocking; wait until the thread " Print "After the access is completed and the lock is released, let the thread "set" continue.

After such processing, when printing the list, either all 0s or all 1s will be output, and there will no longer be the embarrassing scene of half 0s and half 1s.

Example:

#!/usr/bin/python

import threading

import time

class myThread (threading.Thread):

def __init__(self, threadID, name, counter):

threading.Thread.__init__(self)

self.threadID = threadID

                   self.name                                                                                                                                                                                                           self.name                                                      U Self.Counter = Country

DEF RUN (Self):

Print "Starting"+Self.name

#获

, successfully get the True

#optional TimeOUT parameter, will always be blocked when it does not fill in Until the lock is obtained

             # Otherwise it will return False after timeout 

                                                                                                                        threadLock.acquire()                                                                                                          

threadLock.release()

def print_time(threadName, delay, counter):

while counter:

time.sleep(delay)

print "%s: %s" % (threadName, time.ctime(time.time()))

counter -= 1

threadLock = threading.Lock()

threads = []

# Create a new thread

thread1 = myThread(1, "Thread-1", 1)

thread2 = myThread( 2, "Thread-2", 2)

# Start a new thread

thread1.start()

thread2.start()

# Add a thread to the thread list

threads.append(thread1)

threads.append(thread2)

# Wait for all threads to complete

for t in threads:

t.join()

print "Exiting Main Thread"

Thread priority queue ( Queue)

Python's Queue module provides synchronous, thread-safe queue classes, including FIFO (first in first out) queue Queue, LIFO (last in first out) queue LifoQueue, and priority queue PriorityQueue. These queues implement lock primitives and can be used directly in multi-threads. Queues can be used to achieve synchronization between threads.

Commonly used methods in the Queue module:

Queue.qsize() Returns the size of the queue

Queue.empty() If the queue is empty, returns True, otherwise False

Queue.full() If the queue is full , returns True, otherwise False

Queue.full corresponds to maxsize size

Queue.get([block[, timeout]]) to get the queue, timeout waiting time

Queue.get_nowait() is equivalent to Queue.get(False)

Queue.put(item) writes to the queue, timeout waiting time

Queue.put_nowait(item) is equivalent to Queue.put(item, False)

Queue.task_done() After completing a job, Queue.task_done() The function sends a signal to the queue where the task has been completed

Queue.join() actually means waiting until the queue is empty before performing other operations

Example:

#!/usr/bin/python

import Queue

import threading

import time

exitFlag = 0

class myThread (threading.Thread):

def __init__( self, threadID, name, q):

   threading. Thread.__init__(self)

                      self.threadID =   threadID

                                                                                                                            self. Starting " + self.name

" process_data(self .Name, Self.q)

Print "Exning"+Self.name

Def Process_data (ThreadName, Q):

While Not Exitflag:

Queuelock.acquire ()

If not workque.emptt Y (Y ( ):

                                                                                                                                   ;S Print "%s processing%s"%(threadName, data)

else:

queuelock.release ()

time.sleep (1)

ThreadList = ["Thread-", "Thread- 2", "Thread-3"]

nameList = ["One", "Two", "Three", "Four", "Five"]

queueLock = threading.Lock()

workQueue = Queue.Queue (10)

threads = []

threadID = 1

# Create a new thread

for tName in threadList:

thread = myThread(threadID, tName, workQueue)

thread.start()

threads.append(thread)

threadID += 1

# Fill queue

queueLock.acquire()

for word in nameList:

workQueue.put(word)

queueLock.release()

# Wait for the queue to be emptied

while not workQueue.empty():

pass

# Notify the thread that it is time to exit

exitFlag = 1

# Wait for all threads to complete

for t in threads:

t.join()

print "Exiting Main Thread"

The above program execution result:

Starting Thread-1

Starting Thread-2

Starting Thread- 3

Thread- 1 processing One

Thread-2 processing Two

Thread-3 processing Three

Thread-1 processing Four

Thread-2 processing Five

Exiting Thread-3

Exiting Thread-1

Exit ing Thread-2

Exiting Main Thread


Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

AI Hentai Generator

AI Hentai Generator

Generate AI Hentai for free.

Hot Article

R.E.P.O. Energy Crystals Explained and What They Do (Yellow Crystal)
3 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Best Graphic Settings
3 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. How to Fix Audio if You Can't Hear Anyone
3 weeks ago By 尊渡假赌尊渡假赌尊渡假赌

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

What is the function of C language sum? What is the function of C language sum? Apr 03, 2025 pm 02:21 PM

There is no built-in sum function in C language, so it needs to be written by yourself. Sum can be achieved by traversing the array and accumulating elements: Loop version: Sum is calculated using for loop and array length. Pointer version: Use pointers to point to array elements, and efficient summing is achieved through self-increment pointers. Dynamically allocate array version: Dynamically allocate arrays and manage memory yourself, ensuring that allocated memory is freed to prevent memory leaks.

Is distinctIdistinguish related? Is distinctIdistinguish related? Apr 03, 2025 pm 10:30 PM

Although distinct and distinct are related to distinction, they are used differently: distinct (adjective) describes the uniqueness of things themselves and is used to emphasize differences between things; distinct (verb) represents the distinction behavior or ability, and is used to describe the discrimination process. In programming, distinct is often used to represent the uniqueness of elements in a collection, such as deduplication operations; distinct is reflected in the design of algorithms or functions, such as distinguishing odd and even numbers. When optimizing, the distinct operation should select the appropriate algorithm and data structure, while the distinct operation should optimize the distinction between logical efficiency and pay attention to writing clear and readable code.

Who gets paid more Python or JavaScript? Who gets paid more Python or JavaScript? Apr 04, 2025 am 12:09 AM

There is no absolute salary for Python and JavaScript developers, depending on skills and industry needs. 1. Python may be paid more in data science and machine learning. 2. JavaScript has great demand in front-end and full-stack development, and its salary is also considerable. 3. Influencing factors include experience, geographical location, company size and specific skills.

How to understand !x in C? How to understand !x in C? Apr 03, 2025 pm 02:33 PM

!x Understanding !x is a logical non-operator in C language. It booleans the value of x, that is, true changes to false, false changes to true. But be aware that truth and falsehood in C are represented by numerical values ​​rather than boolean types, non-zero is regarded as true, and only 0 is regarded as false. Therefore, !x deals with negative numbers the same as positive numbers and is considered true.

What does sum mean in C language? What does sum mean in C language? Apr 03, 2025 pm 02:36 PM

There is no built-in sum function in C for sum, but it can be implemented by: using a loop to accumulate elements one by one; using a pointer to access and accumulate elements one by one; for large data volumes, consider parallel calculations.

Does H5 page production require continuous maintenance? Does H5 page production require continuous maintenance? Apr 05, 2025 pm 11:27 PM

The H5 page needs to be maintained continuously, because of factors such as code vulnerabilities, browser compatibility, performance optimization, security updates and user experience improvements. Effective maintenance methods include establishing a complete testing system, using version control tools, regularly monitoring page performance, collecting user feedback and formulating maintenance plans.

Copy and paste Love code Copy and paste Love code for free Copy and paste Love code Copy and paste Love code for free Apr 04, 2025 am 06:48 AM

Copying and pasting the code is not impossible, but it should be treated with caution. Dependencies such as environment, libraries, versions, etc. in the code may not match the current project, resulting in errors or unpredictable results. Be sure to ensure the context is consistent, including file paths, dependent libraries, and Python versions. Additionally, when copying and pasting the code for a specific library, you may need to install the library and its dependencies. Common errors include path errors, version conflicts, and inconsistent code styles. Performance optimization needs to be redesigned or refactored according to the original purpose and constraints of the code. It is crucial to understand and debug copied code, and do not copy and paste blindly.

How to obtain real-time application and viewer data on the 58.com work page? How to obtain real-time application and viewer data on the 58.com work page? Apr 05, 2025 am 08:06 AM

How to obtain dynamic data of 58.com work page while crawling? When crawling a work page of 58.com using crawler tools, you may encounter this...

See all articles