多线程,代码示例

Posted yizhixiaowenzi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程,代码示例相关的知识,希望对你有一定的参考价值。

一。threading模块介绍

与multiprocess模块在使用层面上的接口相似。

 

二。开启线程的两种方式

from threading import Thread
def func(name):
    print("my name is %s"%name)
if __name__ == "__main__":
    t = Thread(target=func,args="张三")
    t.start()

from threading import Thread
import time
class Sayhi(Thread):
    def __init__(self,name):
        super().__init__()
        self.name=name
    def run(self):
        time.sleep(2)
        print(%s say hello % self.name)
if __name__ == __main__:
    t = Sayhi(egon)
    t.start()
    print(主线程)

 

 

三。在一个进程下,开启多线程和多进程的区别

技术图片
from threading import Thread
from multiprocessing import Process
import os

def work():
    print(hello)

if __name__ == __main__:
    #在主进程下开启线程
    t=Thread(target=work)
    t.start()
    print(主线程)
    ‘‘‘
    打印结果:
    hello
    主线程
    ‘‘‘

    #在主进程下开启子进程
    p=Process(target=work)
    p.start()
    print(主进程)
    ‘‘‘
    打印结果:
    主进程
    hello
    ‘‘‘
线程的开启速度更快
技术图片
from threading import Thread
from multiprocessing import Process
import os

def work():
    print(hello,os.getpid())

if __name__ == __main__:
    #part1:在主进程下开启多个线程,每个线程都跟主进程的pid一样
    t1=Thread(target=work)
    t2=Thread(target=work)
    t1.start()
    t2.start()
    print(主线程pid,os.getpid())

    #part2:开多个进程,每个进程都有不同的pid
    p1=Process(target=work)
    p2=Process(target=work)
    p1.start()
    p2.start()
    print(主进程pid,os.getpid())
主进程下开启多线程(与主进程pid相同),开启多进程(与主进程pid不同)

 

技术图片
from  threading import Thread
from multiprocessing import Process
import os
def work():
    global n
    n=0

if __name__ == __main__:
    # n=100
    # p=Process(target=work)
    # p.start()
    # p.join()
    # print(‘主‘,n) #毫无疑问子进程p已经将自己的全局的n改成了0,但改的仅仅是它自己的,查看父进程的n仍然为100


    n=1
    t=Thread(target=work)
    t.start()
    t.join()
    print(,n) #查看结果为0,因为同一进程内的线程之间共享进程内的数据
同一进程内的线程共享该进程的数据,进程间数据相互独立

 

 

四。练习

练习一:

技术图片
#_*_coding:utf-8_*_
#!/usr/bin/env python
import multiprocessing
import threading

import socket
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.bind((127.0.0.1,8080))
s.listen(5)

def action(conn):
    while True:
        data=conn.recv(1024)
        print(data)
        conn.send(data.upper())

if __name__ == __main__:

    while True:
        conn,addr=s.accept()


        p=threading.Thread(target=action,args=(conn,))
        p.start()
多线程并发的socket服务端
技术图片
#_*_coding:utf-8_*_
#!/usr/bin/env python


import socket

s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect((127.0.0.1,8080))

while True:
    msg=input(>>: ).strip()
    if not msg:continue

    s.send(msg.encode(utf-8))
    data=s.recv(1024)
    print(data)
客户端

 

练习二:三个任务,一个接收用户输入,一个将用户输入的内容格式化成大写,一个将格式化后的结果存入文件

技术图片
from threading import Thread
msg_l=[]
format_l=[]
def talk():
    while True:
        msg=input(>>: ).strip()
        if not msg:continue
        msg_l.append(msg)

def format_msg():
    while True:
        if msg_l:
            res=msg_l.pop()
            format_l.append(res.upper())

def save():
    while True:
        if format_l:
            with open(db.txt,a,encoding=utf-8) as f:
                res=format_l.pop()
                f.write(%s
 %res)

if __name__ == __main__:
    t1=Thread(target=talk)
    t2=Thread(target=format_msg)
    t3=Thread(target=save)
    t1.start()
    t2.start()
    t3.start()
View Code

 

五。线程相关的其他方法

Thread实例对象的方法:

 

threading模块提供的一些方法:

 

六。守护线程

七。Python GIL

八。同步锁

九。死锁现象与递归锁

十。信号量Semaphore

十一。Event

十二。条件Condition(了解)

十三。定时器

十四。线程queue

十五。python标准模块--concurrent.futures

以上是关于多线程,代码示例的主要内容,如果未能解决你的问题,请参考以下文章

python的多线程多进程代码示例

核心数据多线程:代码示例

11,多线程示例代码

多个请求是多线程吗

多线程,代码示例

线程学习知识点总结