关于join的问题

关于join的问题

可以解释一下join的作用吗?什么是阻塞?join添加了,就只能等上一个线程/进程跑完之后才会运行下一个吗,那还要锁干嘛呢?比如讲在进程中用锁 的知识点时,老师说,不要加join:

import os
import random
import time
from multiprocessing import Process
from multiprocessing import Lock
from multiprocessing import RLock


class WriteProcess(Process):
   '''' 写入文件 '''
   def __init__(self,file_name,number,lock,*args, **kwargs):
       self.filename = file_name
       self.number = number
       self.lock = lock
       super().__init__(*args, **kwargs)

   def run(self):
       ''' 写入文件的主要业务逻辑 '''
       with self.lock:
       # try:
       #
       #     self.lock.acquire()
       #     print('locked')
       #     self.lock.acquire()
       #     print('relocked') # 等释放,死锁
           for i in range(10):
               with open(self.filename, 'a+', encoding='utf-8') as f:
                   context = '线程{0},-{1}-{2}'.format(self.name, self.pid,self.number)
                   f.write(context)
                   print(context)
                   time.sleep(random.randint(1,3))

       # finally:
       #     self.lock.release()
       #     self.lock.release()


if __name__ == '__main__':
   file_name = 'test.txt'
   # 锁的对象
   lock = RLock()
   for x in range(5):
       p = WriteProcess(file_name, x, lock)
       p.start()  # 此处不用join,否则一条进程结束后才会起第二条进程


正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
好帮手慕乃馨 2020-09-02 13:39:20

同学你好。

  1. join是阻塞主线程(进程),等子线程结束后再执行主线程(进程)。

  2. 阻塞是指此线程(进程)需要等其他线程(进程)执行完后才能继续执行。

  3. 锁主要应用于对数据的处理,保证数据不会同时被多个线程(进程)修改。在老师的进程的例子中,是想启用多个进程来写入数据的,如果加了join,只能一个进程一个进程的启用,达不到多进程的效果。

如果我的回答解决了您的疑惑,请采纳,祝学习愉快~~~~

  • 提问者 慕粉4079888 #1
    那定义了一个class,在main中测试时,调用了join,是阻塞了主线程吗?如何体现主线程的阻塞,而运行了其他线程呢?比如说这个代码: class Myprocess(Process): def __init__(self, name, *args, **kwargs): self.my_name = name # print(self.name) super(Myprocess, self).__init__(*args, **kwargs) # 如果super写在前面,就可以使用name,否则父类的name会覆盖子类的name,就要用其他变量 print(self.name) def run(self): print('myprocess进程的名称:{0}, pid:{1}'.format(self.my_name, os.getpid())) time.sleep(5) print('myprocess进程要做的事情') if __name__ == '__main__': # p = Process(target=do_sth, args=('myprocess',)) p = Myprocess('myprocess class') p.start() # 启动 p.join() # 挂起
    2020-09-02 14:36:23
  • 好帮手慕乃馨 回复 提问者 慕粉4079888 #2
    同学你好,为了便于理解,给你举另一个例子。 以下代码创建了5个线程,然后用一个循环激活线程,激活之后令其阻塞主线程: threads = [Thread() for i in range(5)] for thread in threads: thread.start() thread.join() 执行过程: 1. 第一次循环中,主线程通过start函数激活线程1,线程1进行计算 2. 由于start函数不阻塞主线程,在线程1进行运算的同时,主线程向下执行join函数 3. 执行join之后,主线程被线程1阻塞,在线程1返回结果之前,主线程无法执行下一轮循环 4. 线程1计算完成之后,解除对主线程的阻塞 5. 主线程进入下一轮循环,激活线程2并被其阻塞 所以本来应该并发的五个线程,在这里变成了顺序队列,效率和单线程无异。
    2020-09-02 15:59:55
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
1.Python零基础入门
  • 参与学习           人
  • 提交作业       2727    份
  • 解答问题       8160    个

想要进入Python Web、爬虫、人工智能等高薪领域,你需要掌握本阶段的Python基础知识,课程安排带你高效学习轻松入门,学完你也能听得懂Python工程师的行业梗。

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师