使用semaphore,并利用该程序生成2个进程,这两个进程写同一个文件,要求:a.互斥写,即只有一个进程写完后,才能让另一个进程写; b. 一个进程写入内容:“自己学号的后3位PROC1 MYFILE1”;另一个进程写入内容:“自己学号的后3位PROC2 MYFILE2
时间: 2024-02-03 11:14:24 浏览: 68
下面是使用semaphore实现的代码:
```python
import os
import time
import threading
# 定义信号量
semaphore = threading.Semaphore(1)
def write_file(filename, content):
with open(filename, 'a') as f:
f.write(content + '\n')
def process1():
# 获取学号后3位
student_id = os.getlogin()[-3:]
# 写入文件1
semaphore.acquire()
write_file('MYFILE1', student_id + 'PROC1 MYFILE1')
semaphore.release()
def process2():
# 获取学号后3位
student_id = os.getlogin()[-3:]
# 写入文件2
semaphore.acquire()
write_file('MYFILE2', student_id + 'PROC2 MYFILE2')
semaphore.release()
if __name__ == '__main__':
# 创建两个进程
p1 = threading.Thread(target=process1)
p2 = threading.Thread(target=process2)
p1.start()
p2.start()
p1.join()
p2.join()
print('写入完成!')
```
程序中创建了一个Semaphore对象,并设置初始值为1,表示只允许一个线程访问共享资源。在process1和process2中使用acquire方法获取信号量,表示要访问共享资源;在写完文件后使用release方法释放信号量,表示访问结束。
当两个进程同时运行时,先运行的进程会获取信号量,访问共享资源,写完文件后释放信号量,另一个进程才能获取信号量,访问共享资源。这样就能保证两个进程互斥地写同一个文件。
相关推荐
![application/msword](https://img-home.csdnimg.cn/images/20210720083327.png)
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![pptx](https://img-home.csdnimg.cn/images/20210720083543.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)