Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在run-in Simpy期间创建一个新进程比通过线程进行实时创建花费的时间更多_Python_Multithreading_Runtime Error_Real Time_Simpy - Fatal编程技术网

Python 在run-in Simpy期间创建一个新进程比通过线程进行实时创建花费的时间更多

Python 在run-in Simpy期间创建一个新进程比通过线程进行实时创建花费的时间更多,python,multithreading,runtime-error,real-time,simpy,Python,Multithreading,Runtime Error,Real Time,Simpy,我的目标是使用strick=True的simpy(3.0.10)RealtimeEnvironment,并能够在连续模拟过程中组织和控制流程 通过使用线程,我将能够在simpy之外建立更广泛的模型,并保持实时部分的小型化和快速化。 但导致延迟的原因是: “RuntimeError:模拟对实时来说太慢” 小运动: -aprocess=具有简单产量超时的类 -带任务的主进程=进程加打印环境现在 -执行主进程 -接下来在mainprocess中创建一个线程 -对线程进行守护以让simpy继续 -启动线

我的目标是使用strick=True的simpy(3.0.10)RealtimeEnvironment,并能够在连续模拟过程中组织和控制流程
通过使用线程,我将能够在simpy之外建立更广泛的模型,并保持实时部分的小型化和快速化。

但导致延迟的原因是:
“RuntimeError:模拟对实时来说太慢”

小运动:
-aprocess=具有简单产量超时的类
-带任务的主进程=进程加打印环境现在
-执行主进程
-接下来在mainprocess中创建一个线程
-对线程进行守护以让simpy继续
-启动线程比实时步骤花费更多的时间
-准备好后返回

我不能让它工作,所以很明显我在这里做错了什么。
期待在您的帮助下进一步了解。

代码如下:

import simpy
from threading import Thread
from time import sleep

# define a simple timeout process class
class aprocess(object):
    def __init__(self, env, name = 'aname'):
        self.env = env
        self.name = name


    def execute(self):
            while True: # repeat each run step
                print self.name, 'status now: %d at yield 1' %self.env.now
                yield self.env.timeout(5)
                print self.name, 'status now: %d at yield 2' %self.env.now
                yield self.env.timeout(2)

# define the main process class
class mainprocess(object):    
    def __init__(self, env, name = 'aname'):
        self.env = env
        self.name = name

    def printstatus(self):
        while True:
            print ('status now: %d' %self.env.now)
            yield self.env.timeout(1)

    def newtask(self, newTaskname = 'newtask'):
#        Task2name= str(raw_input('give a name for task2:'))
        # this will cause the function to delay longer than accepted by simpy for realtime:
        sleep(3)
        self.newTaskname=newTaskname
        newTask=aprocess(self.env, self.newTaskname)
        self.env.process(newTask.execute())
        print 'THREAD: new Task process created'

    def execute(self):
        t = None
#        processes are events to so they can call other processes:
        self.env.process(self.printstatus())
        Task1=aprocess(self.env, 'Task1')
        self.env.process(Task1.execute())
        print 'MAINPROCESS: Task 1 process created)'
        yield self.env.timeout(6)
        print "creating first thread"
        t=Thread(target=self.newtask())
        t.deamon = True # Daemonize thread
        t.start()
        while self.env.now<20:
            if not t.is_alive:  #check if completed
                print 't.is_alive=flase: tread completed'
                t.join()  #not shure if this is requried, is_alive already activates the thread
            yield self.env.timeout(1)


#run the simulation
env1 = simpy.rt.RealtimeEnvironment(initial_time=0, factor=1.0, strict=True)
Maintask = mainprocess(env1, 'Mainproc')
Mainproc = env1.process(Maintask.execute())
env1.run(until=Mainproc)
导入simpy
从线程导入线程
从时间上导入睡眠
#定义一个简单的超时进程类
类A进程(对象):
定义初始化(self,env,name='aname'):
self.env=env
self.name=名称
def执行(自我):
如果为True:#重复每个运行步骤
打印self.name,“当前状态:%d,收益率为1”%self.env.now
屈服自我环境超时(5)
打印self.name,“当前状态:%d,产量为2”%self.env.now
屈服自我环境超时(2)
#定义主流程类
类mainprocess(对象):
定义初始化(self,env,name='aname'):
self.env=env
self.name=名称
def打印状态(自身):
尽管如此:
打印('当前状态:%d'%self.env.now]
屈服自我环境超时(1)
def newtask(self,newTaskname='newtask'):
#Task2name=str(原始输入('为task2指定名称:'))
#这将导致功能延迟超过simpy接受的实时时间:
睡眠(3)
self.newTaskname=newTaskname
newTask=a进程(self.env、self.newTaskname)
self.env.process(newTask.execute())
打印“线程:已创建新任务进程”
def执行(自我):
t=无
#进程是要调用的事件,因此它们可以调用其他进程:
self.env.process(self.printstatus())
Task1=a进程(self.env,“Task1”)
self.env.process(Task1.execute())
打印“主流程:创建任务1流程)”
屈服自我环境超时(6)
打印“创建第一个线程”
t=线程(目标=self.newtask())
t、 deamon=True#守护线程
t、 开始()

当self.env.now运行时,您是否遇到了问题?只是阅读一下:我想可能确实是这样。在尝试使用python执行线程时,这绝对是一个需要小心的小问题。对于一个理论上应该从多线程中受益匪浅的程序来说,这是很常见的,实际上它会减慢速度。真的,Benjamin,谢谢。快速学习:使用线程进行并发I/O,使用多进程进行并行计算。我看到线程的巨大好处是能够在进程看起来相当独立的情况下实时共享数据。如您所见,原始输入在注释中。线程可以解决吗(阅读关于切换线程的文章…)是解决这个问题的方法吗?我是否应该最好转到睡眠(3)案例的流程。一些快速指导示例,我将非常感谢。