Home Backend Development Python Tutorial An in-depth understanding of multithreading in Python. A must-read for newbies

An in-depth understanding of multithreading in Python. A must-read for newbies

Dec 13, 2016 am 11:15 AM
python

Example 1
We are going to request five different URLs:
Single threaded

import time 
import urllib2    
defget_responses():   
urls=[     
‘http://www.baidu.com',     
‘http://www.amazon.com',     
‘http://www.ebay.com',     
‘http://www.alibaba.com',     
‘http://www.jb51.net'  
 ]   
start=time.time()  
forurlinurls:    
printurl    
resp=urllib2.urlopen(url)     
printresp.getcode()  
print”Elapsed time: %s”%(time.time()-start)    
get_responses()
Copy after login

The output is:
http://www.baidu.com200
http://www.amazon.com200
http://www.ebay .com200
http://www.alibaba.com200
http://www.jb51.net200
Elapsed time:3.0814409256

Explanation:
urls are requested in order
Unless the cpu gets a response from one url, it will not request the next url
The network request will take a long time, so the cpu is waiting for the return time of the network request has been idle.
Multi-threading

import urllib2 
import time 
from threading import Thread   
classGetUrlThread(Thread):   
def__init__(self, url):     
self.url=url     
super(GetUrlThread,self).__init__()      
defrun(self):     
resp=urllib2.urlopen(self.url)     
printself.url, resp.getcode()    
defget_responses():   urls=[     
‘http://www.baidu.com',     
‘http://www.amazon.com',     
‘http://www.ebay.com',     
‘http://www.alibaba.com',     
‘http://www.jb51.net'   
]   
start=time.time()   
threads=[]   
forurlinurls:     
t=GetUrlThread(url)     
threads.append(t)     
t.start()   
fortinthreads:     
t.join()   
print”Elapsed time: %s”%(time.time()-start)    
get_responses()
Copy after login

Output:
http://www.jb51.net200
http://www.baidu.com200
http://www.amazon.com200
http://www.alibaba.com200
http ://www.ebay.com200
Elapsed time:0.689890861511

Explanation:

Aware of the improvement in program execution time
We wrote a multi-threaded program to reduce the waiting time of the CPU. When we are waiting for a network request in a thread to return, the CPU can Switch to other threads to make network requests in other threads.
We expect one thread to process one url, so we pass a url when instantiating the thread class.
Thread running means executing the run() method in the class.
No matter what, we want each thread to execute run().
Create a thread for each URL and call the start() method, which tells the CPU to execute the run() method in the thread.
We want to calculate the time spent when all threads have finished executing, so we call the join() method.
join() can notify the main thread to wait for this thread to end before executing the next instruction.
We called the join() method on each thread, so we calculated the running time after all threads have completed execution.

About threads:

cpu may not execute the run() method immediately after calling start().
You cannot determine the execution order of run() among different threads.
For a single thread, it is guaranteed that the statements in the run() method are executed in order.
This is because the url in the thread will be requested first, and then the returned result will be printed.

Example 2

We will use a program to demonstrate resource competition between multi-threads and fix this problem.

from threading import Thread    
#define a global variable some_var=0   
classIncrementThread(Thread):   
defrun(self):     
#we want to read a global variable     
#and then increment it     
globalsome_var     
read_value=some_var     
print”some_var in %s is %d”%(self.name, read_value)     
some_var=read_value+1    
print”some_var in %s after increment is %d”%(self.name, some_var)    
defuse_increment_thread():   
threads=[]   
foriinrange(50):     
t=IncrementThread()     
threads.append(t)     
t.start()   
fortinthreads:     
t.join()   
print”After 50 modifications, some_var should have become 50″   
print”After 50 modifications, some_var is %d”%(some_var,)    
use_increment_thread()
Copy after login

Run this program multiple times and you will see a variety of different results.
Explanation:
There is a global variable and all threads want to modify it.
All threads should add this global variable 1 .
With 50 threads, the final value should become 50, but it does not.
Why didn’t it reach 50?
When some_var is 15, thread t1 reads some_var. At this time, the CPU gives control to another thread t2.
The some_var read by the t2 thread is also 15
Both t1 and t2 increase some_var to 16
What we expected at that time was t1 t2 two threads make some_var + 2 becomes 17
There is competition for resources here.
The same situation may also occur in other threads, so the final result may be less than 50.
Resolving resource competition

from threading 
import Lock, Thread 
lock=Lock() 
some_var=0   
classIncrementThread(Thread):   
defrun(self):     
#we want to read a global variable     
#and then increment it     
globalsome_var     
lock.acquire()     
read_value=some_var     
print”some_var in %s is %d”%(self.name, read_value)     
some_var=read_value+1    
print”some_var in %s after increment is %d”%(self.name, some_var)     
lock.release()    
defuse_increment_thread():   
threads=[]   
foriinrange(50):     
t=IncrementThread()     
threads.append(t)     
t.start()   
fortinthreads:     
t.join()   
print”After 50 modifications, some_var should have become 50″   
print”After 50 modifications, some_var is %d”%(some_var,)    
use_increment_thread()
Copy after login

Running the program again achieved the results we expected.
Explanation:
Lock Used to prevent race conditions
If thread t1 acquires the lock before performing some operations. Other threads will not perform the same operation before t1 releases the Lock
What we want to make sure is that once thread t1 has read some_var, other threads can not read some_var until t1 has finished modifying some_var
Read like this And modifying some_var becomes a logical atomic operation.
Example 3
Let us use an example to prove that one thread cannot affect variables (non-global variables) in other threads.
time.sleep() can suspend a thread and force thread switching to occur.

from threading import Thread 
import time    
classCreateListThread(Thread):   
defrun(self):     
self.entries=[]     
foriinrange(10):       
time.sleep(1)       
self.entries.append(i)     
printself.entries    
defuse_create_list_thread():   
foriinrange(3):     
t=CreateListThread()     
t.start()    
use_create_list_thread()
Copy after login

After running it a few times, I found that the results I was striving for were not printed out. While one thread is printing, the CPU switches to another thread, so incorrect results are produced. We need to make sure to print self.entries is a logical atomic operation to prevent printing from being interrupted by other threads.
We used Lock(), look at the example below.

from threading import Thread, Lock 
import time    
lock=Lock()    
classCreateListThread(Thread):   
defrun(self):     
self.entries=[]     
foriinrange(10):       
time.sleep(1)       
self.entries.append(i)     
lock.acquire()     
printself.entries     
lock.release()    
defuse_create_list_thread():   
foriinrange(3):     
t=CreateListThread()     
t.start()    
use_create_list_thread()
Copy after login

This time we saw the correct results. It proves that one thread cannot modify the internal variables (non-global variables) of other threads.

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

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

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)

PHP and Python: Different Paradigms Explained PHP and Python: Different Paradigms Explained Apr 18, 2025 am 12:26 AM

PHP is mainly procedural programming, but also supports object-oriented programming (OOP); Python supports a variety of paradigms, including OOP, functional and procedural programming. PHP is suitable for web development, and Python is suitable for a variety of applications such as data analysis and machine learning.

Choosing Between PHP and Python: A Guide Choosing Between PHP and Python: A Guide Apr 18, 2025 am 12:24 AM

PHP is suitable for web development and rapid prototyping, and Python is suitable for data science and machine learning. 1.PHP is used for dynamic web development, with simple syntax and suitable for rapid development. 2. Python has concise syntax, is suitable for multiple fields, and has a strong library ecosystem.

PHP and Python: A Deep Dive into Their History PHP and Python: A Deep Dive into Their History Apr 18, 2025 am 12:25 AM

PHP originated in 1994 and was developed by RasmusLerdorf. It was originally used to track website visitors and gradually evolved into a server-side scripting language and was widely used in web development. Python was developed by Guidovan Rossum in the late 1980s and was first released in 1991. It emphasizes code readability and simplicity, and is suitable for scientific computing, data analysis and other fields.

Python vs. JavaScript: The Learning Curve and Ease of Use Python vs. JavaScript: The Learning Curve and Ease of Use Apr 16, 2025 am 12:12 AM

Python is more suitable for beginners, with a smooth learning curve and concise syntax; JavaScript is suitable for front-end development, with a steep learning curve and flexible syntax. 1. Python syntax is intuitive and suitable for data science and back-end development. 2. JavaScript is flexible and widely used in front-end and server-side programming.

Can vs code run in Windows 8 Can vs code run in Windows 8 Apr 15, 2025 pm 07:24 PM

VS Code can run on Windows 8, but the experience may not be great. First make sure the system has been updated to the latest patch, then download the VS Code installation package that matches the system architecture and install it as prompted. After installation, be aware that some extensions may be incompatible with Windows 8 and need to look for alternative extensions or use newer Windows systems in a virtual machine. Install the necessary extensions to check whether they work properly. Although VS Code is feasible on Windows 8, it is recommended to upgrade to a newer Windows system for a better development experience and security.

How to run sublime code python How to run sublime code python Apr 16, 2025 am 08:48 AM

To run Python code in Sublime Text, you need to install the Python plug-in first, then create a .py file and write the code, and finally press Ctrl B to run the code, and the output will be displayed in the console.

Can visual studio code be used in python Can visual studio code be used in python Apr 15, 2025 pm 08:18 PM

VS Code can be used to write Python and provides many features that make it an ideal tool for developing Python applications. It allows users to: install Python extensions to get functions such as code completion, syntax highlighting, and debugging. Use the debugger to track code step by step, find and fix errors. Integrate Git for version control. Use code formatting tools to maintain code consistency. Use the Linting tool to spot potential problems ahead of time.

Where to write code in vscode Where to write code in vscode Apr 15, 2025 pm 09:54 PM

Writing code in Visual Studio Code (VSCode) is simple and easy to use. Just install VSCode, create a project, select a language, create a file, write code, save and run it. The advantages of VSCode include cross-platform, free and open source, powerful features, rich extensions, and lightweight and fast.

See all articles